시끄러운 이미지 데이터에서 원 감지


17

아래 그림과 같은 이미지가 있습니다. 여기에 이미지 설명을 입력하십시오

원의 반지름 (또는 직경)을 찾으려고합니다. 나는 원형 Hough 변환 (matlab 's 사용 imfindcircles(bw,[rmin rmax],'ObjectPolarity','bright'))을 사용하고 원이나 타원에 맞추려고 노력했습니다 (노이즈가 적은 데이터에 아주 잘 작동하는 집에서 만든 함수입니다 (아래 참조)).

또한 더 선명한 원을 얻기 위해 이미지 처리를 시도했습니다. 예를 들어 아래를 참조하십시오.

se = strel('disk', 2);
bw = imdilate(bw, se);
bw = bwareaopen(bw,100000); 
bw =  edge(bw); 

여기에 이미지 설명을 입력하십시오

그러나 처리 된 이미지를 두 기술 (하프 및 원형 / 타원 피팅)에 공급하면 어느 것도 원을 적절한 방식으로 감지하지 못합니다.

다음은 내가 쓴 서클 파인더의 코드 스 니펫입니다 (matlab) [row col] = find (bw); 등고선 = bwtraceboundary (bw, row (1), col (1)], 'N', 연결성, num_points);

    x = contour(:,2);
    y = contour(:,1);

    % solve for parameters a, b, and c in the least-squares sense by
    % using the backslash operator
    abc = [x y ones(length(x),1)] \ -(x.^2+y.^2);
    a = abc(1); b = abc(2); c = abc(3);

    % calculate the location of the center and the radius
    xc = -a/2;
    yc = -b/2;
    radius  =  sqrt((xc^2+yc^2)-c);

대체 접근법이 인정 될 것입니다 ...


거친 변형은 채워진 디스크가 아닌 원을 찾습니다. 채워진 디스크를 빈 원으로 변환하려면 먼저 가장자리 감지를 수행해야합니다. 서클의 속성은 무엇입니까? 크기가 일정합니까? 타원이 될 수 있습니까? 점들이 다르게 분포 될 수 있습니까?
endolith

나는 시도했다 (편집 된 예 참조), 너무 시끄 럽거나 원형이 아닌가? 또한 크기는 일정하며 카메라 각도 오류로 인해 미세한 타원도를 가질 수 있습니다 (실제로는 완전한 원형 창임).
bla

크기와 모양이 일정한 경우, 원래 도트 이미지로 채워진 디스크 템플릿의 상호 상관 같은 시도 할 수 있습니다
endolith

내 대답 외에도 이미지 처리 파이프의 너무 나중 단계 에서이 작업을 시도하고 있다고 생각합니다. 문제에 대해 자세히 알려 주시고 이전 단계를 보여 주시겠습니까?
Andrey Rubshtein

답변:


13

여기 내 해결책이 있습니다. @ Yoda의 아이디어에 가깝지만 몇 가지 단계를 변경했습니다.

  • 7x7 근처에 최소 6 개의 픽셀이 있도록 모든 픽셀을 표시하십시오.
  • 가장 큰 얼룩을 제거하십시오.
  • 구멍 채우기
  • 가장자리 감지 적용
  • 허프 변환을 사용하여 원 찾기

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

관련 Matlab 코드는 다음과 같습니다. 내 코드에서 circle .m 파일에 Hough 변환을 사용 하고 있습니다.

function FindCircle()
    close all;
    im = imread('C:\circle.png');
    im = im(:,:,2);

    ims = conv2(double(im), ones(7,7),'same');
    imbw = ims>6;
    figure;imshow(imbw);title('All pixels that there are at least 6 white pixels in their hood');

    props = regionprops(imbw,'Area','PixelIdxList','MajorAxisLength','MinorAxisLength');
    [~,indexOfMax] = max([props.Area]);
    approximateRadius =  props(indexOfMax).MajorAxisLength/2;

    largestBlobIndexes  = props(indexOfMax).PixelIdxList;
    bw = false(size(im));
    bw(largestBlobIndexes) = 1;
    bw = imfill(bw,'holes');
    figure;imshow(bw);title('Leaving only largest blob and filling holes');
    figure;imshow(edge(bw));title('Edge detection');

    radiuses = round ( (approximateRadius-5):0.5:(approximateRadius+5) );
    h = circle_hough(edge(bw), radiuses,'same');
    [~,maxIndex] = max(h(:));
    [i,j,k] = ind2sub(size(h), maxIndex);
    radius = radiuses(k);
    center.x = j;
    center.y = i;

    figure;imshow(edge(bw));imellipse(gca,[center.x-radius  center.y-radius 2*radius 2*radius]);
    title('Final solution (Shown on edge image)');

    figure;imshow(im);imellipse(gca,[center.x-radius  center.y-radius 2*radius 2*radius]);
    title('Final solution (Shown on initial image)');

end

1
허프 변환은 여기서 파란색 원을 해결하고 찾도록 만드는 것은 무엇입니까? 이미지의 다른 위치에 다른 반경의 많은 원을 투영하고 가장 적합한 원을 찾는가?
Spacey

@Mohammad, 그것은 일반적인 원형 탐지기입니다. 비닝과 투표를 사용합니다.
Andrey Rubshtein

이 답변의 첫 번째 단계 후에 FRST (Fast Radial Symmetry Transform)를 사용할 수도 있습니다.
Geniedesalpages

10

이미지 처리를 사용하는 것이 매우 간단합니다. 다음은 Mathematica 의 개념 증명입니다 . MATLAB으로 번역해야합니다.

  • 먼저 축을 자르고 이미지 부분 만 유지하십시오. 이 변수를 호출합니다 img.
  • 이미지를 이진화하고 확장 한 다음 채우기 변환을 수행하십시오. 또한 메인 블롭에 연결되지 않은 작은 구성 요소를 제거합니다. 다음과 같은 것을 제공해야합니다.

    filled = Binarize@img ~Dilation~ 3 // FillingTransform // DeleteSmallComponents
    

  • 다음으로이 Blob의 중심과 Blob의 해당 디스크 반경을 찾습니다 (openCV, MATLAB은 모두 이와 동일한 명령을 가짐)

    {center, radius} = 1 /. ComponentMeasurements[filled, {"Centroid", "EquivalentDiskRadius"}]
    
  • 그게 다야! 이제 원본 이미지와 위의 중심과 반지름으로 원을 그려서 이미지가 어떻게 적합한 지 확인하십시오.

    Show[img, Graphics[{Red, Circle[center, radius]}]]
    


멋진 답변! 팽창 및 충전 변환을 확장 할 수 있습니까?
Spacey

@Mohammad Dilation 은 기본 조작이며 위키 기사에서 쉽게 설명 할 수 있습니다. 채우기 변환은 "구멍"또는 다른 말로, 더 높은 값의 픽셀로 둘러싸인 픽셀 세트를 채 웁니다. "추가 정보"섹션을 참조 하십시오
Lorem Ipsum

아 죄송합니다. 잘못 입력했습니다. 나는 팽창 변환에 어느 정도 익숙합니다. 실제로 '충진 변환'을 확장 할 수 있는지 궁금합니다. 정확히 어떤 규칙을 사용하고 있습니까? 관련 정보를 찾을 수 없습니다. 아마도 다른 이름으로 갈까요?
Spacey

@ yoda, 답변 주셔서 감사합니다.하지만 질문을 읽으면 팽창과 피팅을 시도했습니다. 가장자리를 감지하기 전에 생성 된 이미지는 귀하의 이미지와 유사합니다. 맞습니다. 정확하지 않습니다. 적합도 동일합니다. 원 위의 상단 부분에 노이즈가있는 점을 고려하기 때문에 적합 원의 상단 부분이 너무 큰 것을 알 수 있습니다. 나는 또한 타원을 맞추려고 노력했습니다 (질문에 명시된 바와 같이), 문제는 적합성이 충분하지 않다는 것입니다. 아마도 더 좋은 방법은 원의 더 나은 부분 (호)을 사용하여 적합을 만드는 것입니다.
bla

@nate "적합한 원의 상단 부분"과 "원의 더 나은 부분"의 의미를 이해하지 못합니다. 경계 상자, 장축 길이, 단축 길이, 중심으로부터의 평균 거리, 중심으로부터의 중간 거리 등의 다른 메트릭을 사용할 수 있습니다. 모두 원하는 것에 따라 다릅니다.
Lorem Ipsum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.