การค้นหาช่องสี่เหลี่ยมในรูปภาพ


34

ฉันต้องการค้นหาสี่เหลี่ยมในรูปภาพโดยใช้ OpenCV (ไม่มีปัญหาใน MATLAB หรืออื่น ๆ โดยทั่วไปสิ่งที่ฉันคาดหวังคือความคิดบางอย่าง)

พิจารณาภาพทดสอบด้านล่าง:

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

ฉันต้องการค้นหาสี่เหลี่ยมสีเหล่านั้นในภาพด้านบนอย่างถูกต้อง (ไม่ใช่แถบยาวสีขาว)

สิ่งที่ฉันได้ทำ:

  • ฉันใช้วิธีการทั่วไป (ซึ่งมาพร้อมกับตัวอย่าง OpenCV) คือค้นหารูปทรงในระนาบสีทั้งหมดประมาณค่าและตรวจสอบจำนวนองค์ประกอบ = 4 มันทำงานเพื่อขยายบางส่วนที่ตรวจพบไม่กี่สี่เหลี่ยมโดยเฉพาะอย่างยิ่งที่มืด

  • ขั้นตอนต่อไปที่ผมทำก็คือการทำนาย คือข้อตกลงนี้ได้รับการแก้ไข ดังนั้นหากได้รับบางอย่างฉันสามารถทำนายสิ่งที่เหลืออยู่ได้ มันยังทำงานเพื่อขยายเพิ่มเติม แต่ความแม่นยำนั้นแย่มาก

แต่ฉันรู้สึกว่าการทำนายไม่ใช่วิธีที่ดีที่นี่และมันก็ไม่ได้ให้คำตอบที่ถูกต้องเสมอไปตามขั้นตอนแรก

สิ่งที่ฉันต้องการ :

1) มีวิธีอื่นใดที่ดีกว่าในการตรวจสอบกำลังสองเหล่านี้อย่างแม่นยำมากขึ้น หรือหลายวิธี?

จุดหนึ่งที่สำคัญก็คือว่าเวลาไม่ได้เป็นปัญหาที่นี่ อัลกอริทึมอาจช้ามันไม่สำคัญ แต่ความแม่นยำเป็นเกณฑ์สำคัญ

บางครั้งภาพอาจเบลอมากขึ้น

และหนึ่งในปัญหาสำคัญที่ฉันเผชิญคือสี่เหลี่ยมบางอันมีสีเกือบเหมือนกันกับพื้นหลัง (ตรวจสอบคอลัมน์ 3 คอลัมน์แรกและสี่เหลี่ยมที่สอง)

กำลังมองหาแนวคิดขอบคุณล่วงหน้า

อัปเดต:

ด้านล่างเป็นผลลัพธ์ที่แม่นยำที่สุดที่ฉันได้รับ:

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

แน่นอนภาพผลลัพธ์จะถูกปรับขนาดเล็กน้อย

อัปเดต 2:

ฉันได้รับคำตอบที่ดีกว่านี้ในคำตอบของฉันด้านล่าง: https://dsp.stackexchange.com/a/7526/818


พื้นหลังของคุณเป็นสีขาวเสมอ?

1
ความคิดของฉันคือการคำนวณ "saturation" และ threshold sat sat แต่ใช้ตัวอย่างของคุณมันทำงานได้ไม่ดี (คำนวณ saturation เป็น max (RG, RB, GB) ความจริงที่ว่าสี่เหลี่ยมบางอันดูเหมือนพื้นหลังทำให้ สิ่งที่ค่อนข้างยากหากภาพทั้งหมดของคุณมีรูปแบบเดียวกัน (แถบสีขาวที่มีสี่เหลี่ยมยาวอยู่ถัดจากพวกเขา) คุณควรพิจารณาหาบิตที่ง่ายที่สุด (เช่นสี่เหลี่ยมสีจริง ๆ หรือแถบสีขาว) เพื่อหาตำแหน่งอื่น ๆ สี่เหลี่ยมและ ... หาวิธีที่จะตรวจสอบว่าพวกเขามีจริงหรือไม่ยาก แต่น่าสนใจ! คุณสามารถให้ภาพเพิ่มเติมได้หรือไม่

ฉันคิดว่าสิ่งนี้ไม่น่าจะมีการเคลื่อนไหว
Junuxx

1
คุณสามารถให้ภาพเพิ่มเติมหรือไม่ นอกจากนี้สิ่งนี้คืออะไร?
Andrey Rubshtein

2
OP จำเป็นต้องตอบคำถาม พื้นหลังสีขาวอาจไม่จำเป็น และมีอะไรขึ้นกับแสง? มันจะแย่ขนาดนั้นเหรอ? สิ่งเหล่านี้ดูซับซ้อนไม่จำเป็นสำหรับฉัน
แทซองชิน

คำตอบ:


9

ความพยายามครั้งแรกโดยใช้ Matlab:

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

ผลลัพธ์ในภูมิภาคต่อไปนี้:

ภูมิภาคที่มีข้อความ

อย่างที่คุณเห็นการเลือกเกณฑ์ที่ส่งผลให้จำนวนภูมิภาคสูงสุด (T = 120) จะให้สถานที่ที่ถูกต้อง 7 แห่งแล้วบางแห่งที่รวมสถานที่ที่ถูกรวมอยู่หนึ่งแห่งที่เป็นเท็จบวกและเชิงลบที่เป็นเท็จสองแห่ง

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

นอกจากนี้ยังจะช่วยถ้าคุณให้ภาพทดสอบอีกสองสามภาพ


8

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

ขั้นตอนที่ 1: ค้นหาสี่เหลี่ยมให้ได้มากที่สุด

ผมแยกภาพเพื่อ R, G, B, H, S, V และเครื่องบิน thresholded ภาพสำหรับค่าเกณฑ์ที่แตกต่างกันเช่นหลาย 25 สำหรับแต่ละภาพที่ผมพบสี่เหลี่ยมในนั้นและนำพวกเขาใน"หน้ากากภาพ" ฉันยังพบความสูงและความกว้างเฉลี่ยของจตุรัสอีกด้วย

ภาพหน้ากาก (ตรวจพบสี่เหลี่ยมรวม 7/12):

ภาพหน้ากาก

ขั้นตอนที่ 2: สร้างตารางกำลังสอง

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

ideal_squares:

ภาพในอุดมคติ

ขั้นตอนที่ 3: ทำการแมป ideal_image ใหม่

ตอนนี้เรามีเซนทรอยด์ในอุดมคติและเซนทรอยด์ดั้งเดิม ฉันพบการจับคู่ที่ถูกต้องสำหรับเซนทรอยด์ดั้งเดิมจากอุดมคติ _ เซนทรอยด์ จากนั้นฉันก็ใช้ Scipy interpolate.griddata สำหรับการแก้ไขและ remapped ideal_image ตามค่าเซนทรอยด์ (มันเกือบจะเหมือนกับการแปรปรวนที่ทำในคำถามและคำตอบเหล่านี้: วิธีลบข้อบกพร่องนูนในรูปสี่เหลี่ยม sudoku & OpenCV ) ดังนั้นด้านล่างเป็นผลลัพธ์ที่ฉันได้รับ:

ผลผลิต:

ภาพออก

ขั้นตอนที่ 4: หรือดำเนินการด้านบนด้วยหน้ากากรูปจากขั้นตอนแรก

ผลลัพธ์สุดท้าย

ตอนนี้คุณสามารถเห็นสี่เหลี่ยมทั้งหมดถูกตรวจพบ แต่มีปัญหาที่กล่าวถึงด้านล่าง:

ปัญหา:

ดูผลลัพธ์ของขั้นตอนที่ 3 เช่นรูปภาพที่ถูกแมปใหม่ของตารางสี่เหลี่ยม ยกเว้นสองสี่เหลี่ยมกลางช่องสี่เหลี่ยมอื่น ๆ ทั้งหมดจะถูกตัด มันเป็นปัญหาที่เกี่ยวข้องกับการแมปใหม่นี้ ฉันไม่แน่ใจว่ามีปัญหาอยู่ที่ไหนกับ scipy.interpolate.griddata () หรือ cv2.remap () ฉันคิดว่าภาพทั้งหมดจะถูกทำให้โค้งงอ แต่ไม่ได้ มันบิดเบี้ยวเฉพาะภาพภายในเซนทรอยด์ที่เราให้ หากฉันสามารถแก้ไขได้ผลลัพธ์จะเป็นปกติ

ดังนั้นถ้าใครรู้ความคิดที่ดีสำหรับเรื่องนี้ยินดีต้อนรับมากที่สุด !!!


5

หมายเหตุ: วิธีนี้จะช้าจริงๆ

สร้างหน้ากากที่ดูเหมือนกับรูปทรงของวัตถุในอุดมคติ คล้ายกับสิ่งนี้:

หน้ากากของวัตถุ

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

วิธีการนี้ไม่ได้คำนึงถึงการยกกำลังสองให้กลมกลืนไปกับพื้นหลังหรือแม้กระทั่งการบังวัตถุบางส่วนเนื่องจากมันคำนึงถึงวัตถุทั้งหมด

ฉันใช้วิธีนี้เป็นการส่วนตัวสำเร็จแล้วเพื่อติดตามหนูจมูกและหนวด แต่ฉันมีข้อสันนิษฐานบางอย่างเช่นใกล้กับตำแหน่งที่รู้จักล่าสุดเป็นต้น แต่ฉันคิดว่าคุณสามารถทำให้พื้นที่การค้นหาลดลงด้วยการใช้สมมติฐานบางอย่างเช่นขนาดที่เป็นไปได้ ของวัตถุในกล้อง, ไกลแค่ไหนจากศูนย์กลางได้หรือการหมุน <10 องศา ฯลฯ


5

ขั้นตอนที่ 1: สิ่งที่ภาพไบนารีสุดท้ายที่คุณได้รับจากการวิเคราะห์ในระนาบ B, G, R, H, S, V ในภาพนั้นทำอัลกอริทึมการนับหยด

ขั้นตอนที่ 2: ค้นหาหยดที่ใหญ่ที่สุดบนพื้นฐานของพื้นที่หรือความยาวรูปร่าง เนื่องจาก blobs ของคุณส่วนใหญ่จะเป็นรูปสี่เหลี่ยมด้านขนานดังนั้นพื้นที่หรือรูปร่างจึงไม่มีใครทำ

ขั้นตอนที่ 3: ด้วยหยดที่ใหญ่ที่สุด (เนื่องจากหยดที่ใหญ่ที่สุดคือหยดที่ดีที่สุดที่คล้ายกับสี่เหลี่ยมจัตุรัสในโลกแห่งความเป็นจริงของคุณ) พยายามหาการวางแนวของหยด ... นี่คุณจะได้รูปสี่เหลี่ยมที่เหมาะสมที่สุดหรือคุณสามารถได้คะแนน ... รับความชันของเส้นที่มารวมกัน (ทั้งเส้นขอบฟ้าและแนวตั้ง)

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

ขั้นตอนที่ 5: เนื่องจากในแต่ละแนวนอนและแนวตั้งระยะห่างจะเท่ากัน (ระยะห่างแนวนอนและแนวตั้งจะเท่ากันเมื่อมันมาจากภาพสแควร์ในอุดมคติของคุณ แต่เราจะไม่ถือว่า .. ) เพียงแค่หาเซนทรอยด์ที่เป็นไปได้ สี่เหลี่ยมด้านขนาน

BOTTOM LINE:หากมีใครตรวจจับสี่เหลี่ยมจัตุรัสได้อย่างสมบูรณ์แบบคุณสามารถสร้างกริดทั้งหมดได้ เพียงให้เครื่องหมายศูนย์อยู่ที่ช่วงเวลา 2H (H = ความกว้างแนวนอนของหยดที่ใหญ่ที่สุด) ตามแกนแนวนอนของหยดที่ใหญ่ที่สุดและในช่วง 2V (V = ความสูงแนวตั้งของหยดที่ใหญ่ที่สุด) ในแนวตั้งตามแนวแกนของหยด

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

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


1
+1 - มันจะดีถ้าคุณสามารถใช้มันได้
Abid Rahman K

2
@AbidRahmanK นั่นไม่ใช่สิ่งที่ StackExchange ใช้ คำถาม -> คำตอบ มิฉะนั้นสิ่งนี้จะจบลงด้วยการเป็นงานที่ยุติธรรม
Jan Krüger

2

ข้อตกลงนี้ได้รับการแก้ไขแล้ว

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

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


ฉันพบ 3-4 กำลังสองโดยใช้วิธีการแสดงรูปร่าง จากนั้นได้ความสูงและความกว้างของแต่ละตาราง จากนั้นตรวจสอบช่องว่างระหว่างช่องสี่เหลี่ยมที่ตรวจพบและสันนิษฐานว่าช่องว่างระหว่างช่องนั้นมีขนาดใหญ่พอที่จะถือสี่เหลี่ยมอีกช่องได้ นั่นคือคำทำนายที่ฉันทำ
Abid Rahman K

สี่เหลี่ยมบางอันมีสีเกือบเหมือนกันกับพื้นหลัง ดังนั้นฉันจึงกลัวพวกเขาจะถูกพิจารณาว่าเป็นพื้นที่ที่ไม่ใช่ตารางตามวิธีการของคุณ
Abid Rahman K

บางทีคุณอาจลองใช้ทุกคอลัมน์เพื่อพล็อตโค้งโดยที่แกน x จะเป็นความสูง (เป็นพิกเซล) ในภาพและแกน y คือความเข้ม จากนั้นคุณสามารถลองหาคมตัดด้วยรูปอนุพันธ์

นั่นคือการตรวจจับขอบตัวเองใช่มั้ย ฉันลองแล้ว แต่ไม่ได้ผลลัพธ์ที่ดี
Abid Rahman K

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

0

ฉันขอแนะนำให้ใช้การแปลง Hough ซึ่งเป็นอัลกอริทึมที่แข็งแกร่งมากสำหรับการค้นหารูปร่างที่เรียบง่ายเช่นเส้นวงกลมหรืออื่น ๆ การตรวจจับเส้นจะดีที่สุดในกรณีของคุณ คุณสามารถหาด้านข้างของ sripes สีขาวยาวอย่างน้อย; จากนั้นด้วยอัลกอริธึมการแยกมุม (แฮร์ริสหรือแม้แต่ SIFT หรือ SURF) คุณสามารถหามุมตามเส้นเหล่านั้นแม้ใช้ความจริงที่ว่าสแควร์สมีระยะห่างเท่ากัน


0

ฉันลองใช้ปัญหานี้โดยใช้ opencv, python วิธีการที่เกี่ยวข้องกับการปิดบังภาพตามสีตามด้วยการค้นหารูปทรงที่เหมาะสม

รหัส: https://github.com/rbhambriiit/computer_vision/blob/master/find_color_boxป้อนคำอธิบายรูปภาพที่นี่

[พลาด 1 กล่อง แต่ควรมาด้วยการปรับฟังก์ชั่นการปิดบัง]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.