Phát hiện vòng tròn trong dữ liệu hình ảnh nhiễu


17

Tôi có một hình ảnh trông giống như hình dưới đây: nhập mô tả hình ảnh ở đây

Tôi đang cố gắng tìm bán kính (hoặc đường kính) của vòng tròn. Tôi đã thử sử dụng biến đổi Hough tròn (thông qua matlab imfindcircles(bw,[rmin rmax],'ObjectPolarity','bright')) và bằng cách khớp với hình tròn hoặc hình elip (chức năng tự làm tại nhà hoạt động khá tốt cho dữ liệu ít nhiễu hơn, xem bên dưới).

Tôi cũng đã thử xử lý một số hình ảnh để có được một vòng tròn rõ ràng hơn, ví dụ, xem bên dưới:

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

nhập mô tả hình ảnh ở đây

Tuy nhiên, khi tôi cung cấp hình ảnh được xử lý cho cả hai kỹ thuật (khớp Hough và circle \ ellipse), cả hai đều không thể phát hiện ra vòng tròn một cách tử tế.

Đây là đoạn mã của trình tìm vòng tròn tôi đã viết (matlab) [row col] = find (bw); contour = bwtraceboundary (bw, hàng (1), col (1)], 'N', kết nối, num_point);

    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);

Phương pháp thay thế sẽ được đánh giá cao ...


Biến đổi Hough tìm kiếm một vòng tròn, không phải là một đĩa đầy. trước tiên bạn cần thực hiện phát hiện cạnh để chuyển đổi đĩa đầy thành một vòng tròn trống. các thuộc tính của vòng tròn của bạn là gì? kích thước không đổi? họ có thể là hình elip? các chấm có thể được phân phối khác nhau?
endolith

Tôi đã thử (xem ví dụ chỉnh sửa), nó quá ồn hoặc không đủ tròn? Ngoài ra, kích thước là không đổi và nó có thể có độ elip phút (mặc dù trong thực tế, nó là một cửa sổ tròn hoàn hảo) do lỗi góc máy ảnh.
bla

nếu kích thước và hình dạng không đổi, bạn có thể thử một cái gì đó như tương quan chéo của một mẫu đĩa đầy với hình ảnh chấm ban đầu
endolith

Bên cạnh câu trả lời của tôi, tôi nghĩ rằng bạn có thể đang cố gắng thực hiện điều này trong giai đoạn quá muộn của đường ống xử lý hình ảnh của bạn. Bạn có thể cho chúng tôi biết thêm về vấn đề, và hiển thị một số bước trước?
Andrey Rubshtein

Câu trả lời:


13

Đây là giải pháp của tôi, nó gần với ý tưởng của @ Yoda, nhưng tôi đã thay đổi một số bước.

  • Đánh dấu tất cả các pixel sao cho có ít nhất 6 pixel trong vùng lân cận 7x7 của chúng
  • Loại bỏ tất cả các đốm màu, nhưng lớn nhất
  • Lấp đầy lỗ
  • Áp dụng phát hiện cạnh
  • Tìm vòng tròn bằng cách sử dụng biến đổi Hough

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Đây là mã Matlab có liên quan. Tôi đang sử dụng biến đổi Hough cho tệp .m trong vòng tròn .

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
Biến đổi Hough đang làm gì ở đây khiến nó giải quyết và tìm ra vòng tròn màu xanh? Có phải nó đang chiếu nhiều vòng tròn bán kính khác nhau ở các vị trí khác nhau trên ảnh và tìm ra một vòng tròn phù hợp nhất?
Spacey

@Mohammad, nó là máy dò vòng tròn thông thường. Nó sử dụng binning và bỏ phiếu.
Andrey Rubshtein

Bạn cũng có thể sử dụng Biến đổi đối xứng xuyên tâm nhanh (FRST) sau bước đầu tiên trong câu trả lời này.
Geniedesalpages

10

Nó khá đơn giản để làm điều đó bằng cách sử dụng xử lý hình ảnh. Sau đây là một bằng chứng về khái niệm trong Mathematica . Bạn sẽ phải dịch nó sang MATLAB.

  • Đầu tiên, cắt các trục và chỉ giữ lại phần hình ảnh của nó. Tôi gọi biến này img.
  • Làm mờ hình ảnh và làm giãn nó, theo sau là một biến đổi điền. Tôi cũng loại bỏ các thành phần nhỏ đi lạc không được kết nối với blob chính. Nó sẽ cung cấp cho bạn một cái gì đó như sau:

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

  • Tiếp theo, tìm trọng tâm của blob này và bán kính đĩa tương đương của blob (openCV, MATLAB đều có các lệnh tương đương để làm điều này)

    {center, radius} = 1 /. ComponentMeasurements[filled, {"Centroid", "EquivalentDiskRadius"}]
    
  • Đó là nó! Bây giờ vẽ hình ảnh gốc và một vòng tròn với tâm và bán kính ở trên để xem nó phù hợp như thế nào:

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


Câu trả lời tuyệt vời! Bạn có thể vui lòng mở rộng trên biến đổi giãn nở & điền?
Spacey

@Mohammad Dilation là một hoạt động cơ bản và sẽ được giải thích dễ dàng bằng bài viết wiki. Biến đổi điền vào lấp đầy "lỗ hổng" hay nói cách khác, các pixel được bao quanh bởi các pixel có giá trị cao hơn. Xem phần "Thông tin thêm" tại đây
Lorem Ipsum

Ah xin lỗi, tôi gõ sai. Tôi có phần quen thuộc với biến đổi giãn nở, tôi thực sự tự hỏi liệu bạn có thể mở rộng trên 'biến đổi điền' không. Quy tắc nào đặt nó đang sử dụng chính xác? Tôi dường như không thể tìm thấy thông tin liên quan đến điều đó. Có lẽ nó đi bằng một tên khác?
Spacey

@yoda, cảm ơn bạn đã trả lời, nhưng nếu bạn đọc câu hỏi bạn nhận thấy tôi đã thử giãn nở và phù hợp. Hình ảnh được tạo ra trước khi tôi phát hiện các cạnh tương tự như của bạn. Tôi nhận được một số phù hợp, nó không chính xác. Điều tương tự cũng phù hợp với sự phù hợp của bạn, bạn có thể thấy rằng phần trên cùng của vòng tròn được trang bị quá lớn, có lẽ là do bạn tính đến điểm nhiễu trên phần trên cùng của vòng tròn. Tôi cũng đã cố gắng để phù hợp với một hình elip (như đã nêu trong câu hỏi), vấn đề là sự phù hợp đó không đủ tốt. Tôi nghĩ rằng có lẽ cách tốt hơn là sử dụng phần tốt hơn của vòng tròn (một vòng cung) để làm cho phù hợp.
bla

@nate Tôi không hiểu ý của bạn là "phần trên cùng của vòng tròn được trang bị" và "phần tốt hơn của vòng tròn". Bạn có thể sử dụng các số liệu khác nhau ... hộp giới hạn, chiều dài trục chính, chiều dài trục nhỏ, khoảng cách trung bình từ centroid, khoảng cách trung bình từ centroid, v.v ... Tất cả phụ thuộc vào những gì bạn muốn.
Lorem Ipsum
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.