การนับจำนวนวัตถุที่คั่นด้วยขอบภาพใน MATLAB


9

ฉันมีภาพ RGB พร้อมสัญญาณต่าง ๆ เป้าหมายหลักของฉันคือการนับสัญญาณที่สัมผัสกับเส้นขอบภาพ

แนวทางและปัญหา

ฉันเริ่มโดยการโหลดภาพ [รูป 1] จากนั้นแปลงเป็นสีเทาและใช้ตัวกรองมัธยฐานเพื่อกำจัดเสียงรบกวน [รูปที่ 1] 2] จากนั้นฉันก็ทำการไบนาริมิเตอร์ด้วยค่า 0.2 ซึ่งส่งผลให้รูปที่ 3 ในขณะนี้ฉันได้รับภาพที่ถูกจัดรูปแบบของฉัน แต่ปัญหาคือบางส่วนที่เป็นสัญลักษณ์เดียวกันปรากฏในภูมิภาคต่าง ๆ แทนที่จะเป็นเพียงภาพเดียว ตอนนี้เป้าหมายของฉันคือการรวมภูมิภาคที่เป็นวัตถุเดียวกันดังนั้นฉันสามารถใช้bwlabelเพื่อนับจำนวนสัญญาณที่อยู่ในภาพและใช้imclearborderเพื่อกำจัดสิ่งที่อยู่ในเส้นขอบและใช้bwlabelอีกครั้งเพื่อให้ได้ความแตกต่างระหว่าง ทั้งสอง.

วิธีการของฉันคือการใช้bwmorph, Dilateการขยายวัตถุและแล้วพยายามที่จะกรอกพวกเขาด้วย,imfill holesแต่ปัญหาคือถ้าฉันขยายมันในปริมาณเล็กน้อย [รูป 4] imfillดูเหมือนจะไม่เติมพวกเขาถ้าฉันขยายพวกมันด้วยจำนวนมาก [รูปที่ 5] วัตถุทั้งหมดเริ่มรวม :(

รหัส

img=im2double(imread('image.png')); figure, imshow(img) 
img_gray=rgb2gray(img); imshow(img_gray);                                 
img_mediana=medfilt2(img_gray, [3 3]); figure, imshow(img_mediana);       
img_bin=im2bw(img_mediana, 0.2); imshow(img_bin)
img_dilate=bwmorph(img_bin, 'Dilate', 10); imshow(img_dilate)
img_fill=imfill(img_dilate, 'Holes'); figure, imshow(img_fill)

ตัวเลข

รูปที่ 1 :

รูปที่ 1 http://dl.dropbox.com/u/5272012/1.png

รูปที่ 2 :

รูปที่ 2 http://dl.dropbox.com/u/5272012/2.png

รูปที่ 3 :

รูปที่ 3 http://dl.dropbox.com/u/5272012/3.png

รูปที่ 4 :

รูปที่ 4 http://dl.dropbox.com/u/5272012/4.png

รูปที่ 5 :

รูปที่ 5 http://dl.dropbox.com/u/5272012/5.png


คำถามของฉันคือสิ่งที่จะบอกคุณว่าสัญญาณเสีย? คุณต้องการนำออกจริง ๆ ได้อย่างไร ฉันหมายถึง - คุณต้องการให้ Colorize สัญญาณทั้งหมดที่ถูกตัดออกหรือไม่? หรือคุณต้องการแสดงแต่ละเครื่องหมายและจำแนกการตัด / เต็มจริง ๆ หรือไม่
Dipan Mehta

คำตอบ:


3

ในความคิดของฉันการพังทลายของการขยายตัวเป็นเครื่องมือพื้นฐานมาก คุณมีฐานข้อมูลที่แข็งแกร่งมากและมีภาพอินพุตที่เหมาะสมในการตัดสินใจ

นี่คือมุมมองของฉัน:

  1. ด้วยความสำเร็จอย่างสมเหตุสมผลที่คุณได้แสดงให้เห็นจากรูปที่ 1 ถึง 3 คุณสามารถระบุและแบ่งกลุ่มอาการแต่ละอย่างได้

  2. สมมติว่าคุณทราบสัญญาณล่วงหน้าคุณสามารถใช้อัลกอริธึมที่รวดเร็วในการจับคู่รูปแบบ ในกรณีที่ไม่ทราบรูปแบบที่แน่นอนคุณสามารถระบุรูปร่างด้านนอกของรูปแบบได้

  3. คุณสามารถกำหนดเซนทรอยด์ของแต่ละรูปแบบที่ตรงกันและความกว้างและความสูงตามลำดับ หากเซนทรอยด์ X ตำแหน่ง Y อยู่ใกล้กับชายแดนมากเกินไป - เช่นcentroid(x)<0 หรือ centroid(x)>imagewidthshapewidth มันอยู่นอกขอบในทำนองเดียวกันคุณสามารถใช้สำหรับแกน Y เช่นกัน

  4. ระบุว่าคุณมีความกังวลเกี่ยวกับสิ่งที่อยู่บนขอบ - คุณควรเริ่มต้นด้วยแต่ละขอบเท่านั้นและเริ่มจับคู่รูปแบบที่นั่น เริ่มต้นที่ตรงกับรูปแบบบางส่วน / รูปร่างและถ้าบางส่วนรูปแบบ / รูปทรงที่ไม่ตรงกับวัตถุที่เป็นถูกตัดบนขอบ

นี่คือข้อมูลอ้างอิงบางส่วนที่อาจช่วยให้คุณกำหนดปัญหาได้ดี

บทความนี้เป็นเรื่องดีที่จะเข้าใจพื้นฐานมากมายเกี่ยวกับสัญญาณ / โทเค็นที่คุณติดต่อด้วย

Anil K. เชนและ Aditya Vailaya ตามรูปร่างสืบค้น: กรณีศึกษาที่มีเครื่องหมายการค้าภาพฐานข้อมูล รูปแบบการรับรู้ปี 1998 ฉบับ 31, no9, pp. 1369-1390

มีองค์ประกอบการวิจัยมากมายที่เกี่ยวข้องกับการจับคู่รูปร่าง / รูปแบบบางส่วนหรือที่แยกออก

Eli Saber, Yaowu Xu, A. Murat Tekalp การจดจำรูปร่างบางส่วนโดยการจับคู่เมทริกซ์ย่อยสำหรับการจับคู่บางส่วนของการติดฉลากภาพแนะนำการจดจำรูปแบบ 38 (2005) 1560 - 1573

จะขยายคำตอบนี้สำหรับข้อความค้นหาที่เฉพาะเจาะจงมากขึ้นถ้าคุณใช้วิธีนี้


เฮ้! ฉันไม่สามารถใช้การจับคู่รูปแบบได้เนื่องจากจะใช้เวลานานและทำงานกับคอมพิวเตอร์มากเกินไป อีกทั้งขนาดของวัตถุ (เครื่องหมาย) สามารถเป็นตัวแปรได้ (อาจารย์ให้ภาพแบบสุ่มกับเราที่ระดับสัญญาณสามารถมากจาก + 30% ถึง -30% ดังนั้นการจับคู่รูปแบบจึงไม่มีประโยชน์ฉันต้องการวิธีที่เร็วกว่าใน เพื่อแก้ปัญหานี้
Rui Trovisco

@RuiTrovisco ฉันเข้าใจสิ่งนี้ ซึ่งเป็นสาเหตุที่ฉันเขียน - ฉันจะปรับปรุงคำตอบตามความคิดเห็นของคุณ ฉันได้แสดงความคิดเห็นกับคำถามของคุณแล้ว โปรดย้อนกลับ
Dipan Mehta

1

นี่คือแรงบันดาลใจเล็ก ๆ น้อย ๆ ที่แสดงสิ่งที่ตรงกันข้ามกับสิ่งที่คุณกำลังมองหา

เริ่มต้นด้วย fig3

% Find background
labels = bwlabel(~fig3);
[n,idx] = hist(labels(:),0:max(labels(:)));
[bgrSize bgrLableIdx] = max(n);
bgr = (labels == idx(bgrLableIdx));
bgr = imopen(bgr,strel('disk',3));

% Remove border objects and cleanup
borderCleared = imclearborder(~bgr);
borderCleared = imopen(borderCleared,strel('disk',3));

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

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