การตรวจจับวงกลมในข้อมูลภาพที่มีเสียงดัง


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

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามเมื่อฉันป้อนรูปภาพที่ถูกประมวลผลไปยังเทคนิคใด ๆ (การปรับ Hough และ circle \ ellipse) ทั้งคู่ไม่สามารถตรวจจับวงกลมในลักษณะที่เหมาะสมได้

นี่คือข้อมูลโค้ดของตัวค้นหาวงกลมที่ฉันเขียน (matlab) [row col] = find (bw); contour = bwtraceboundary (bw, แถว (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);

แนวทางอื่น ๆ จะได้รับการชื่นชม ...


การแปลงแบบ Hough มองหาวงกลมไม่ใช่ดิสก์ที่ถูกเติม คุณจะต้องทำการตรวจจับขอบก่อนเพื่อทำการแปลงดิสก์ที่ถูกเติมให้เป็นวงกลมเปล่า วงกลมของคุณมีคุณสมบัติอย่างไร? ขนาดคงที่คืออะไร? พวกมันจะเป็นรูปวงรีได้ไหม? สามารถกระจายจุดต่างกันได้หรือไม่?
endolith

ฉันลอง (ดูตัวอย่างที่แก้ไขแล้ว) มันอาจมีเสียงดังหรือไม่กลมพอใช่ไหม นอกจากนี้ขนาดคงที่และอาจมีรูปวงรีนาที (แต่ในความเป็นจริงมันเป็นหน้าต่างวงกลมที่สมบูรณ์แบบ) เนื่องจากข้อผิดพลาดมุมกล้อง
bla

หากขนาดและรูปร่างคงที่คุณอาจลองทำสิ่งที่สัมพันธ์กันอย่างสมบูรณ์ของเทมเพลตดิสก์ที่เติมด้วยภาพจุดดั้งเดิม
endolith

นอกเหนือจากคำตอบของฉันฉันคิดว่าคุณอาจพยายามทำสิ่งนี้ในขั้นตอนต่อไปของท่อประมวลผลภาพของคุณ คุณช่วยบอกเราเพิ่มเติมเกี่ยวกับปัญหาและแสดงขั้นตอนก่อนหน้าได้ไหม
Andrey Rubshtein

คำตอบ:


13

นี่คือทางออกของฉันมันใกล้กับความคิดของ @ Yoda แต่ฉันเปลี่ยนขั้นตอนบางอย่าง

  • ทำเครื่องหมายพิกเซลทั้งหมดเพื่อให้มีอย่างน้อย 6 พิกเซลในพื้นที่ใกล้เคียง 7x7
  • ลบ blobs ทั้งหมด แต่ใหญ่ที่สุด
  • เติมหลุม
  • ใช้การตรวจจับขอบ
  • ค้นหาวงกลมโดยใช้การแปลง Hough

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

นี่คือรหัส Matlab ที่เกี่ยวข้อง ฉันกำลังใช้การแปลง Hough สำหรับไฟล์. m วงกลมในรหัสของฉัน

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
Hough transform กำลังทำอะไรที่นี่เพื่อแก้ปัญหาและค้นหาวงกลมสีน้ำเงิน มันฉายวงกลมหลายวงของรัศมีที่แตกต่างกันในตำแหน่งต่าง ๆ บนภาพและค้นหาวงที่เหมาะที่สุดหรือไม่?
Spacey

@ Mohammad เป็นเครื่องตรวจจับวงกลมปกติ มันใช้ binning และการลงคะแนน
Andrey Rubshtein

คุณยังสามารถใช้การแปลงสมมาตรแบบรวดเร็วของ Radial (FRST) หลังจากขั้นตอนแรกในคำตอบนี้
Geniedesalpages

10

มันค่อนข้างตรงไปตรงมาที่จะใช้การประมวลผลภาพ ต่อไปนี้เป็นข้อพิสูจน์ของแนวคิดในMathematica คุณจะต้องแปลมันเป็น MATLAB

  • ขั้นแรกตัดแต่งแกนและเก็บเฉพาะส่วนของภาพ ฉันเรียกตัวแปรนี้imgว่า
  • เปลี่ยนภาพให้เป็นสองเท่าและขยายภาพตามด้วยการเปลี่ยนไส้ ฉันยังลบส่วนประกอบขนาดเล็กหลงทางที่ไม่ได้เชื่อมต่อกับหยดหลัก มันควรจะให้อะไรบางอย่างเช่น:

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

  • ถัดไปหาเซนทรอยด์ของหยดนี้และรัศมีดิสก์ที่เทียบเท่าของหยด (openCV, MATLAB ทั้งหมดมีคำสั่งเทียบเท่าในการทำเช่นนี้)

    {center, radius} = 1 /. ComponentMeasurements[filled, {"Centroid", "EquivalentDiskRadius"}]
    
  • แค่นั้นแหละ! ตอนนี้พล็อตภาพต้นฉบับและวงกลมที่มีจุดศูนย์กลางและรัศมีด้านบนเพื่อดูว่ามันเหมาะสมอย่างไร:

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


คำตอบที่ยอดเยี่ยม! คุณช่วยกรุณาขยายการแปลงขยายและเติมได้หรือไม่?
Spacey

@ Mohammad Dilationเป็นการดำเนินการขั้นพื้นฐานและสามารถอธิบายได้ง่ายโดยบทความ wiki การเติมการแปลงเติมเต็มใน "หลุม" หรือกล่าวอีกนัยหนึ่งชุดของพิกเซลที่ล้อมรอบด้วยพิกเซลที่มีมูลค่าสูงกว่า ดูส่วน "ข้อมูลเพิ่มเติม" ได้ที่นี่
Lorem Ipsum

ขอโทษทีฉันพิมพ์ผิด ฉันค่อนข้างคุ้นเคยกับการเปลี่ยนแปลงการขยายตัวฉันสงสัยจริงๆว่าถ้าคุณสามารถขยายใน 'การแปลงเติม' กฎชุดใดที่ใช้อย่างถูกต้อง ฉันไม่สามารถหาข้อมูลที่เกี่ยวข้องได้ อาจเป็นเพราะชื่ออื่นหรือ
Spacey

@yoda ขอขอบคุณสำหรับคำตอบ แต่ถ้าคุณอ่านคำถามที่คุณสังเกตเห็นฉันได้ลองขยายและกระชับ ภาพที่สร้างขึ้นก่อนที่ฉันจะตรวจจับขอบคล้ายกับของคุณ ฉันได้รับพอดีมันไม่ถูกต้อง เช่นเดียวกับขนาดที่พอดีคุณจะเห็นได้ว่าส่วนบนของวงกลมที่มีขนาดใหญ่เกินไปอาจสันนิษฐานได้เพราะคุณคำนึงถึงจุดที่มีเสียงดังในส่วนบนของวงกลม ฉันได้พยายามใส่วงรี (ตามที่ระบุไว้ในคำถาม) ปัญหาก็คือความพอดีไม่ดีพอ ฉันคิดว่าวิธีที่ดีกว่านี้น่าจะใช้ส่วนที่ดีกว่าของวงกลม (ส่วนโค้ง) เพื่อทำแบบให้พอดี
bla

@nate ฉันไม่เข้าใจความหมายของคุณโดย "ส่วนบนของวงกลมที่ติดตั้งไว้" และ "ส่วนที่ดีกว่าของวงกลม" คุณสามารถใช้ตัวชี้วัดที่แตกต่างกัน ... กล่อง จำกัด , ความยาวแกนหลัก, ความยาวแกนเล็ก ๆ , ระยะทางเฉลี่ยจากเซนทรอยด์, ค่ามัธยฐานระยะทางจากเซนทรอยด์ ฯลฯ ทุกอย่างขึ้นอยู่กับสิ่งที่คุณต้องการ
Lorem Ipsum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.