2017-01-17 4 views
1

겹쳐진 선 모양 (왼쪽 그림)으로 이미지 작업을하고 있습니다. 궁극적으로 나는 하나의 객체를 구분하고자한다. 저는 이것을 달성하기 위해 Hough 변환과 함께 작업하고 있습니다. (상당히) 다른 방향의 라인을 찾는 데 효과적입니다. 아래의 거친 공간에있는 두 개의 맥시마로 표시됩니다 (가운데 플롯).라인 모양의 오브젝트 추출

houghline - full example

  • 녹색과 노란색 라인 (왼쪽 플롯)와 십자가 (바로 플롯)은 라인의 두께 뭔가를 접근 방식에서 줄기. 나는 넓은 선을 추출하는 방법을 알아낼 수 없었다. 그래서 나는 따라 가지 않았다.
  • "겹치는 픽셀"을 지정하는 모호성을 알고 있습니다. 나는 그 문제를 나중에 다룰 것이다.

하나의 연결된 영역에 몇 개의 라인 객체가 포함될 수 있는지 모르겠으므로, 가장 좋은 활성화 (여기서는 파란색으로 표시)가있는 휴 라인에 반복적으로 객체를 추출하는 것이 좋습니다. 즉, 이미지에서 선 모양의 객체를 제거하여 다음 반복에서 다른 선만 찾습니다.

그러나 어떤 픽셀이 선 모양의 오브젝트에 속하는 지 어떻게 감지합니까?

함수 hough_bin_pixels(img, theta, rho, P) (here 사람 - 오른쪽 그래프에 도시)가 특정 광고에 대응하는 화소를 제공한다. 그러나 그것은 분명히 객체를 표현하기에는 선이 너무 가볍다.

가장 강한 허풍선을 따라 배치 된 전체 물체를 세그먼트/감지하는 방법이 있습니까?

답변

1

중요한 점은 원본 이미지의 두꺼운 선이 Hough Transform의 더 넓은 봉우리로 변환된다는 것입니다. 이 이미지는 얇고 두꺼운 선의 피크를 보여줍니다.

Thick and thin line with resulting Hough Transform

당신은 함께 그룹에 각 피크의 모든 픽셀/누적 쓰레기통을 당신이 좋아하는 어떤 전략을 사용할 수 있습니다. multithreshimquantize을 사용하여 BW 이미지로 변환 한 다음 bwlabel으로 연결하여 연결된 구성 요소에 레이블을 지정하는 것이 좋습니다. 또한 다른 여러 클러스터링/분할 전략을 사용할 수 있습니다. 잠재적으로 까다로운 부분은 적절한 임계 값 수준을 파악하는 것입니다. 응용 프로그램에 적합한 것을 얻을 수 없다면 나중에 너무 잘못된 픽셀을 제거 할 수 있기 때문에 너무 많이 포함하는 편이 낫습니다. 여기

는 임계 (왼쪽) 및 라벨 (오른쪽)

Thresholded peaksLabeled peaks

는 피크 영역이되면, 원본 이미지의 픽셀 어떤 알 수 기여한 후의 변환 허프의 피크이다 hough_bin_pixels을 사용하여 각 축전지 빈에 연결하십시오. 그런 다음 각 피크 영역에 대해 영역의 일부인 모든 저장소에 대해 hough_bin_pixels의 결과를 결합하십시오.여기

Reconstructed Lines

내가 샘플 이미지를 만들어 함께 던졌다 코드입니다. 난 잠시 동안 그것을 사용하지 않으면 그냥 다시 matlab에지고있어, 그러니 제발 부주의 코드를 용서하십시오.

% Create an image 
image = zeros(100,100); 

for i = 10:90 
    image(100-i,i)=1; 
end; 

image(10:90, 30:35) = 1; 

figure, imshow(image); % Fig. 1 -- Original Image 

% Hough Transform 
[H, theta_vals, rho_vals] = hough(image); 
figure, imshow(mat2gray(H)); % Fig. 2 -- Hough Transform 

% Thresholding 
thresh = multithresh(H,4); 
q_image = imquantize(H, thresh); 
q_image(q_image < 4) = 0; 
q_image(q_image > 0) = 1; 
figure, imshow(q_image) % Fig. 3 -- Thresholded Peaks 

% Label connected components 
L = bwlabel(q_image); 
figure, imshow(label2rgb(L, prism)) % Fig. 4 -- Labeled peaks 

% Reconstruct the lines 
[r, c] = find(L(:,:)==1); 
segmented_im = hough_bin_pixels(image, theta_vals, rho_vals, [r(1) c(1)]); 
for i = 1:size(r(:)) 
    seg_part = hough_bin_pixels(image, theta_vals, rho_vals, [r(i) c(i)]); 
    segmented_im(seg_part==1) = 1; 
end 
region1 = segmented_im; 

[r, c] = find(L(:,:)==2); 
segmented_im = hough_bin_pixels(image, theta_vals, rho_vals, [r(1) c(1)]); 
for i = 1:size(r(:)) 
    seg_part = hough_bin_pixels(image, theta_vals, rho_vals, [r(i) c(i)]); 
    segmented_im(seg_part==1) = 1; 
end 
region2 = segmented_im; 

figure, imshow([region1 ones(100, 1) region2]) % Fig. 5 -- Segmented lines 

% Overlay and display 
out = cat(3, image, region1, region2); 
figure, imshow(out); % Fig. 6 -- For fun, both regions overlaid on original image 
+0

실제로 이것은 정말 멋진 아이디어였습니다. 선들이 실제로 길이가 다르다면 문제가 있습니다. 임계 접근법은 전역 적 최대치만큼 높지 않은 지역의 Hough maxima (작은 선들에 해당)를 가릴 수 있습니다. 나는 여전히 그것에 대해 연구 중이다. 그러나 그렇지 않으면 이것이 좋은 접근법이다! 고맙습니다! – Honeybear

+0

미래에이 답변을 참조하는 사람은 임계 변환 문제를 해결할 수있는 좋은 방법은 평균 변환을 사용하여 Hough Transform에서 로컬 최대 값을 찾는 것입니다. –

+0

안녕하세요 @ Honeybear이 답변으로 질문에 대한 답변을 얻으려면 [수락] (https://meta.stackexchange.com/q/5234/179419)을 클릭하여 확인하십시오. 이는 해결책을 찾았으며 응답자와 자신에게 어느 정도의 평판을 제공한다는 것을 더 넓은 커뮤니티에 나타냅니다. 이를 수행 할 의무는 없습니다. –