การจับคู่เทมเพลตมาตราส่วนและการหมุน


12

ฉันกำลังมองหาวิธีการจับคู่แม่แบบที่คงที่และการหมุน ฉันได้ลองแล้วบางส่วน แต่พวกเขาก็ไม่ได้ผลดีนักสำหรับตัวอย่างของฉัน การตรวจจับคุณสมบัติ SIFT และ SURF ล้มเหลวโดยสิ้นเชิง ฉันยังพยายามใช้ฟังก์ชั่นการจับคู่เทมเพลต Log-Polar แต่ฉันไม่เคยทำเสร็จ (ไม่รู้วิธีการ)

ในบทความเหล่านี้ (ที่แรกคือในเยอรมัน)

http://cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/Wentker-Vortrag.pdf

http://www.jprr.org/index.php/jprr/article/viewFile/355/148

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

source_log_polar.png http://www.shareimages.com/images/pics/0/0/3/62394-pZSfl5WenZysnpyVnKg-source_log_polar.png

template_log_polar.png

และหลังจากจับคู่ภาพทั้งสองนี้ด้วยฟังก์ชั่นการจับคู่เทมเพลตของ OpenCV ฉันก็ได้ผลลัพธ์นั้น

match_log_polar.png

ตอนนี้ฉันไม่ทำต่อไป

แม่แบบของฉันเป็นสัญลักษณ์ง่าย ๆ ในการสร้างพิมพ์เขียวและพิมพ์เขียวเอง สัญลักษณ์อาจมีขนาดและทิศทางแตกต่างกัน

เช่นพิมพ์เขียวอย่างง่ายของฉัน:

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

และแม่แบบของฉัน

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

ในตัวอย่างนี้มีเพียงหนึ่งเทมเพลต แต่ในพิมพ์เขียวมันควรจะค้นหาสิ่งที่เกิดขึ้นทั้งหมดแม้กระทั่งสิ่งที่มีขนาดและ / หรือทิศทาง

ไม่มีใครมีวิธีการที่ฉันสามารถแก้ปัญหานี้ได้หรือไม่?

แก้ไข:

นอกเหนือจากแนวทางของ Andrey อัลกอริทึมการจับระยะทางสำหรับโปรไฟล์เรเดียล (ใช้ EmguCV)

private float[] getRadialProfile( Image<Gray, byte> image, Point center, int resolution )
 {

 var roi = image.ROI;

 if ( !roi.Contains( center ) )
  {
   return null;
  }

 var steps = resolution;
 var degreeSteps = 360 / (double)resolution;
 var data = image.Data;
 var peak = 0.0f;
 var bottom = double.MaxValue;
 var bottomIndex = 0;
 var width = roi.Width;
 var height = roi.Height;
 var minX = roi.X;
 var minY = roi.Y;

 float[] distances = new float[resolution];
 for ( var i = 0; i < steps; i++ )
  {
   var degree = i * degreeSteps;
   var radial = degree * Math.PI / 180.0;
   var dy = Math.Sin( radial );
   var dx = Math.Cos( radial );

   var x = (double)center.X;
   var y = (double)center.Y;

   while ( true )
    {
    x += dx;
    y += dy;
    if ( x >= minX + width || y >= minY + height || x <= minX || y <= minY )
     {
      x = -1;
      y = -1;
      break;
     }
    var pixel = data[(int)y, (int)x, 0];
    if ( pixel == 0 )
     {
      break;
     }
    }

    float distance = 0.0f;
    if ( x != -1 && y != -1 )
    {
      distance = (float)Math.Sqrt( Math.Pow( (center.X - x), 2 ) + Math.Pow( (center.Y - y), 2 ) );
    }

    distances[i] = distance;
    if ( distance > peak )
    {
      peak = distance;
    }
    if ( distance < bottom )
    {
      bottom = distance;
      bottomIndex = i;
    }
   }

    // Scale invariance. Divide by peak
   for ( var i = 0; i < distances.Length; i++ )
   {
     distances[i] /= peak;
   }

    // rotation invariance, shift to lowest value
   for ( var i = 0; i < bottomIndex; i++ )
   {
     distances.ShiftLeft(); // Just rotates the array nothing special
   }

   return distances;
}

ยินดีต้อนรับสู่ dsp.SE. เราจะพยายามช่วยคุณ แต่การให้ข้อมูลที่แม่นยำยิ่งขึ้นนั้นน่าจะดี คุณหมายถึงอะไรโดย SIFT และ SURF "ล้มเหลวโดยสิ้นเชิง" พวกเขาตรวจพบ / จับคู่อะไร นอกจากนี้ฉันเองก็ไม่รู้เกี่ยวกับการจับคู่เทมเพลต Log-Polar แต่ถ้าคุณลองแล้วปัญหาตรงไหนล่ะ
Penelope

การตรวจจับคุณสมบัติ SIFT และ SURF ไม่พบคุณลักษณะใด ๆ ในภาพเทมเพลต ดูเหมือนเทมเพลตจะมีข้อมูลน้อยเกินไป (เพียงแค่ก้มตัวเล็ก ๆ และบรรทัด) สำหรับการจับคู่ Log-Polar ฉันพบกระดาษที่มันอธิบาย แต่ไม่ใช่คณิตศาสตร์ที่แน่นอนอยู่ด้านหลัง ฉันจะค้นหาและเพิ่ม
Arndt Bieberstein

ที่นี่เราไป: cvpr.uni-muenster.de/teaching/ss08/seminarSS08/downloads/ … (บทความภาษาเยอรมัน) และนี่jprr.org/index.php/jprr/article/viewFile/355/148
Arndt Bieberstein

เฮ้คนไม่มากที่นี่สามารถเข้าใจภาษาเยอรมันได้ฉันคิดว่า: D แต่สำหรับทุกอย่างอื่น: คุณสามารถแก้ไขโพสต์ของคุณเองเพื่อเพิ่มข้อมูลใหม่ในที่ที่เหมาะสมแทนที่จะแสดงความคิดเห็น และคุณยังไม่ได้พูดในสิ่งที่คุณมีปัญหา
Penelope

3
ผู้เขียน "german Article" มีบทความเป็นภาษาอังกฤษ - www-cs.engr.ccny.cuny.edu/~wolberg/pub/icip00.pdf (ขอบคุณ google)
SergV

คำตอบ:


6

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

ดังนั้นคำแนะนำของฉันคือ:

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

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

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

นี่คือรหัส Matlab บางส่วนสำหรับคุณที่จะเริ่มต้นด้วย - ฉันเขียนส่วนที่ค้นหาโปรไฟล์ระยะทางสำหรับหยดเฉพาะและคำนวณสำหรับแม่แบบ:

function Doors
    im = imread('http://i.stack.imgur.com/Tf8EV.png');
    im = im(:,:,1);
    template = imread('http://i.stack.imgur.com/PlP4i.png');
    template = template(:,:,1);

    blobs = regionprops(template>0,'Area','Image');
    largestBlob = GetLargestBlob(blobs);
    [prof,edgeImage] = GetBlobRadialProfile(largestBlob);

    figure;
    subplot(1,2,1);plot(prof); title('Radial profile')
    subplot(1,2,2);imshow(edgeImage); title('Template');

end

function [prof,edgeImage] = GetBlobRadialProfile(blob)
    paddedImage = padarray( blob.Image,[8 8]);
    erodedImage = imerode(paddedImage,strel('disk',1));
    edgeImage = xor(erodedImage,paddedImage);

    c = regionprops(paddedImage,'Centroid');
    cx  = c.Centroid(1);
    cy  = c.Centroid(2);

    [y,x] = find(edgeImage);
    rad = (x(:)-cx).^2 + (y(:)-cy).^2;
    [~,minIndex] = min(rad);
    contour = bwtraceboundary(edgeImage, [y(minIndex), x(minIndex)],'N');
    prof = (contour(:,2)-cx).^2 + (contour(:,1)-cy).^2;
    prof = prof./max(prof);
end

function largestBlob = GetLargestBlob(blobs)    
    area = [blobs.Area];
    [~,index] = max(area);
    largestBlob = blobs(index);
end

ฉันเดาว่ามันไม่ทำงานกับรูปร่างที่ไม่ปิดใช่ไหม หรือฉันแค่ข้าม "หลุม" เหล่านี้ในรูปร่าง
Arndt Bieberstein

@ArndtBieberstein ใช่มันใช้ได้เฉพาะกับรูปร่างที่ปิดอยู่ ฉันเดาว่าควรมีวิธีการที่จะขยายออกไป
Andrey Rubshtein

เนื่องจาก OpenCV ไม่มีฟังก์ชั่น bwtraceboundary ฉันจึงเขียนของตัวเองและเพียงแค่ "ข้าม" รูและเติมด้วยศูนย์ นี่คือตัวอย่างเล็กน้อยว่าตอนนี้ผลลัพธ์มีลักษณะอย่างไร 5 แปลงสำหรับแต่ละแม่แบบ จุดสีแดงคือจุดเริ่มต้น พล็อตตัวอย่าง
Arndt Bieberstein

@AndndBieberstein ดีมาก! บางทีคุณสามารถแบ่งปันผลลัพธ์กับเราได้เมื่อคุณทำเสร็จแล้ว
Andrey Rubshtein

แน่นอนว่ารหัสนั้นไม่ดีหรือนักแสดง แต่มันใช้งานได้ ฉันจะแนบไว้ใต้คำถามของฉัน มันเขียนใน C # (ฉันใช้ EmguCV)
Arndt Bieberstein

3

นี่คือแนวคิดพื้นฐานของสิ่งที่ฉันรู้ว่าสามารถทำได้ขึ้นอยู่กับการพูดคุยของศาสตราจารย์ Anurag Mittal ของ IIT Madras

แนวคิดคือการตรวจจับวัตถุตามรูปร่าง แต่สามารถขยายออกไปได้อย่างชัดเจนเช่นกัน

  1. คำนวณ edgels โดยใช้ Berkeley edge detector
  2. เชื่อมต่อขอบที่ได้รับ "การตรวจจับขอบเขตวัตถุระดับโลก"
  3. การจับคู่รูปร่างโดยใช้ Chamfer distance หรือ Houstoff Distance

กระดาษของเขาในแบบเดียวกันมีอยู่ที่: การตรวจจับวัตถุหลายขั้นตอนด้วยรูปร่างหลายขั้นตอน

ในทางกลับกันฉันคิดว่า SIFT ควรทำงานเป็นอัลกอริธึมการตรวจหามุมที่จะทำงานกับคุณลักษณะเทมเพลตที่คุณมีอยู่ตรงนั้น

หมายเหตุ: SIFT ไม่แปรเปลี่ยนอย่างสมบูรณ์ ไม่สามารถรับมือกับการหมุน> 60 องศาหรือมากกว่านั้น ดังนั้นการสร้างเทมเพลตหลายรายการจึงเป็นความคิดที่ดี

ในฐานะที่เป็น log-polar จาก Fourier-Mellin Transfroms: พวกมันทำให้เกิดการสูญเสียข้อมูลเนื่องจากวิธีการสุ่มตัวอย่างเกิดขึ้นสำหรับการแปลง


วิธีนี้ฟังดูมีแนวโน้มดีจริงๆ! ฉันไม่สามารถเปิดลิงก์ของคุณได้ แต่ฉันเข้าไปที่แนวทางของคุณ ฉันไม่ทราบว่า SIFT ที่ SIFT ไม่หมุนอย่างสมบูรณ์! คำตอบที่ดีมาก! +1
Arndt Bieberstein

1
ฉันแทบจะไม่พบอะไรเกี่ยวกับ Chamfer ระยะทางและวิธีการทำงานสำหรับผู้ที่ยังค้นหานี้ลองนี้การเชื่อมโยง
Arndt Bieberstein

@Naresh SIFT ไม่ใช่การหมุนไม่แปรปรวนสำหรับการหมุนใหญ่ออกจากเครื่องบิน ไม่ได้อยู่ในระนาบเดียวกัน
a-Jays

1

ฉันไม่ได้คิดอะไรมากมาย แต่ฉันค่อนข้างมั่นใจว่าวิธีแก้ปัญหาที่แข็งแกร่งสามารถทำได้โดยไม่มีปัญหากับการใช้ Fourier Descriptors (FD) ฉันคิดว่าปัญหาของคุณอาจเป็นตัวเลือกที่ดีสำหรับเรื่องนี้ อย่าคิดว่าคุณต้องทำการตรวจจับขอบ b / c คุณมีภาพวาดเส้นสีดำ เพียงแค่เริ่มสแกนแรสเตอร์จนกว่าคุณจะพิกเซลใด ๆ แล้วทำต่อไปนี้:

เพียงแค่ปฏิบัติกับขอบเขตห้องของคุณราวกับว่าพวกเขาเป็นสัญญาณ 1D ซึ่งความกว้างของสัญญาณคือระยะทางปกติจากเซนทรอยด์ของวัตถุตัวอย่างในอัตราคงที่ ดังนั้นทำแบบ FD ง่ายสำหรับประตู จากนั้นสแกนพารามิเตอร์ของแต่ละห้องด้วยตัวกรองนูนเพื่อมองหาขอบที่เพิ่มขึ้นจุดสูงสุดและจุดตกซึ่งกำหนดหน้าต่างเริ่ม / หยุดของ "สัญญาณ" เพื่อจับภาพ ใช้ FFT หรือ FD อื่นที่คล้ายคลึงกันใน "สัญญาณ" ที่จับได้และเปรียบเทียบกับเทมเพลต FD บางทีขั้นตอนการเปรียบเทียบเทมเพลตอาจเป็นความสัมพันธ์แบบง่าย ๆ กับเกณฑ์เพื่อกระตุ้นการแข่งขัน เนื่องจากมีเพียงประตูของคุณเท่านั้นที่มีขอบกลมซึ่งน่าจะเป็นปัญหาการจับคู่ FD ที่ง่ายดาย

คิดว่ามันเหมือนกับการใช้ FD ของการทำภาพหรือการดึงเพลงจากฐานข้อมูล มีกระดาษขาวมากมายในนั้น

นี่เป็นแบบฝึกหัดที่ดีเกี่ยวกับการใช้ FD เพื่อรูปร่างโดยประมาณ: ฉันสงสัยว่าคุณต้องการมัน แต่คุณยังสามารถแปลงรูปภาพของคุณเป็นกรอบพิกัดเชิงขั้วเพื่อจัดการกับการหมุนเช่นเดียวกับที่เสนอในบทความนี้: การดึงภาพโดยใช้รูปร่าง ตัวบ่งชี้ฟูริเยร์ทั่วไป

มาดูกันว่าพวกเขา FD พารามิเตอร์การตรวจสอบปริมณฑลแอปเปิ้ล? ความคิดเช่นเดียวกับประตูของคุณ

BTW ฉันค่อนข้างแน่ใจว่าการทำแผนที่ทั้งพิกัดเชิงขั้วจะไม่ช่วยให้ค่าคงที่ในการหมุน - คุณจะต้องทำเช่นนั้นเกี่ยวกับเซนทรอยด์ของแต่ละประตูซึ่งเป็นสิ่งที่ปัญหาของคุณเริ่มต้น นั่นเป็นเหตุผลที่ฉันคิดว่าคุณต้องการจับผู้สมัครที่ประตูและอาจแมปผู้ที่มีพิกัดเชิงขั้วเพื่อจับคู่กับเทมเพลตประตู FD เช่นเดียวกับที่ทำในกระดาษที่เชื่อมโยงด้านบน

แจ้งให้เราทราบว่ามันจะไปอย่างไรถ้าคุณลองวิธีนี้


0

บางทีคุณอาจพบว่ารหัส Matlab ที่ฉันเขียนมีประโยชน์: Fractal Mosaics

มันใช้กระดาษ "การลงทะเบียนภาพที่มีประสิทธิภาพโดยใช้การแปลงแบบล็อก - โพลาร์" ( pdf ) ในแอปพลิเคชั่นศิลปะที่ต้องการความทนทานมากกว่าวิธีแบบดั้งเดิมที่ฉันพบ

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