2012-08-08 5 views
2

흑백 점 (픽셀)이있는 이미지가 있습니다. 흰색 점의 x, y 좌표를 포함하는 모든 다른 흰색 픽셀 집합에 대해 서로 다른 집합을 만들어야합니다. 예를 들어 3 개의 검정 이미지가 흰색 이미지의 연결된 섬이 아닌 경우 좌표가있는 3 개의 집합을 생성해야합니다. 아무도 나를 위해 알고리즘을 제안 할 수 있습니까?검은 색 흰색 이미지의 연결된 영역 (섬)을 찾는 알고리즘

세포 아마도 abs(x1-x2) <=1 && abs(y1-y2)<=1

+0

열거하도록 구성되며, 한 셀에 대한 더 효율적인 계산 테스트'is_not_connected 될 = A [N, m]^a [n-1, m]; // 지수화가 아니라 XOR을 의미합니다. 이미지 흑백입니까? –

+0

도구로 닫으려는 투표 rec. –

답변

2

Region growing 트릭을해야합니다. 이 링크는 다른 질문에 답하고 있지만 기본적인 알고리즘은 사용자의 요구에 맞아야합니다. 클러스터의 번호를 알려주는 다른 인수를 전달하면됩니다. 1로 시작하고 새 클러스터를 시작할 때마다이 값을 증가시킵니다.

이 새 인수는 전경으로 1을, 배경으로 2를 대신합니다. 이렇게하면 모든 클러스터의 총 수와 모든 위치가 표시됩니다.

0

홍수 채우기 알고리즘을 사용합니다. 연결된 지역 수를 찾으려면 import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator;

import javax.xml.transform.Source; 
import java.awt.*; 
import java.awt.font.ImageGraphicAttribute; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Collections; 

/** 
* Created by IntelliJ IDEA. 
* User: ruzbeh 
* Date: 6/29/12 
* Time: 12:58 AM 
* To change this template use File | Settings | File Templates. 
*/ 
public class Solution { 


    static int[][] img; 

    static void compLabel(int i, int j, int m,int n) { 
     if(i<0 || j<0 ||i > n-1||j > n-1) return; 
     if (img[i][j] == 1) { 
      img[i][j] = m; 
      compLabel(i - 1, j - 1, m,n); 
      compLabel(i - 1, j, m,n); 
      compLabel(i - 1, j + 1, m,n); 
      compLabel(i, j - 1, m,n); 
      compLabel(i, j + 1, m,n); 
      compLabel(i + 1, j - 1, m,n); 
      compLabel(i + 1, j, m,n); 
      compLabel(i + 1, j + 1, m,n); 
     } 
    } 


    public static void main(String[] args) throws IOException { 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 

     int T = Integer.parseInt(br.readLine()); 
     for (int t = 0; t < T; t++) { 
      int n = Integer.parseInt(br.readLine()); 
      img = new int[n][n]; 
      int label = 2; 
      for (int i = 0; i < n; i++) { 
       int j = 0; 
       for (String str : br.readLine().split(" ")) { 
        int value = Integer.parseInt(str); 

        img[i][j] = value; 

        j++; 
       } 

      } 
      for (int y = 0; y < n; y++) 
       for (int x = 0; x < n; x++) 
        if (img[x][y] == 1) { 
         compLabel(x, y, ++label,n); 
        } 

      System.out.println(label - 2); 
     } 
    } 
} 
관련 문제