ช่วยให้เข้าใจการแปลง Hough


19

ฉันกำลังพยายามให้ Hough เปลี่ยนไปทำงานใน MATLAB แต่ฉันมีปัญหา ฉันมีวิธีที่ไม่ดีในการตรวจหาจุดสูงสุดที่ต้องแก้ไข แต่ก่อนหน้านั้นฉันต้องสามารถย้อนกลับการแปลง Hough เพื่อสร้างเส้นอีกครั้งอย่างถูกต้อง นี่คือประเภทของสิ่งที่ฉันได้รับตอนนี้:

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

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

%% load a sample image; convert to grayscale; convert to binary

%create 'x' image (works well)
a = eye(255);
b = flipud(eye(255));
x = a + b;
x(128,128) = 1;

%image = rgb2gray(imread('up.png')) < 255;
%image = rgb2gray(imread('hexagon.png')) < 255;
%image = rgb2gray(imread('traingle.png')) < 255;
%%% these work
%image = x;
%image = a;
image = b;    

%% set up variables for hough transform
theta_sample_frequency = 0.01;                                             
[x, y] = size(image);
rho_limit = norm([x y]);                                                
rho = (-rho_limit:1:rho_limit);
theta = (0:theta_sample_frequency:pi);
num_thetas = numel(theta);
num_rhos = numel(rho);
hough_space = zeros(num_rhos, num_thetas);

%% perform hough transform
for xi = 1:x
    for yj = 1:y
        if image(xi, yj) == 1 
            for theta_index = 1:num_thetas
                th = theta(theta_index);
                r  = xi * cos(th) + yj * sin(th);
                rho_index = round(r + num_rhos/2);                      
                hough_space(rho_index, theta_index) = ...
                     hough_space(rho_index, theta_index) + 1;
            end
        end
    end
end  

%% show hough transform
subplot(1,2,1);
imagesc(theta, rho, hough_space);
title('Hough Transform');
xlabel('Theta (radians)');
ylabel('Rho (pixels)');
colormap('gray');

%% detect peaks in hough transform
r = [];
c = [];
[max_in_col, row_number] = max(hough_space);
[rows, cols] = size(image);
difference = 25;
thresh = max(max(hough_space)) - difference;
for i = 1:size(max_in_col, 2)
   if max_in_col(i) > thresh
       c(end + 1) = i;
       r(end + 1) = row_number(i);
   end
end

%% plot all the detected peaks on hough transform image
hold on;
plot(theta(c), rho(r),'rx');
hold off;


%% plot the detected line superimposed on the original image
subplot(1,2,2)
imagesc(image);
colormap(gray);
hold on;

for i = 1:size(c,2)
    th = theta(c(i));
    rh = rho(r(i));
    m = -(cos(th)/sin(th));
    b = rh/sin(th);
    x = 1:cols;
    plot(x, m*x+b);
    hold on;
end

เชื่อมโยง: ทำ De-Houghing ของภาพที่แปลง Hough ได้อย่างไร


คุณจัดการเพื่อแก้ปัญหาของคุณหรือไม่ ฉันกำลังเผชิญกับปัญหาที่คล้ายกัน ขอบคุณ
Erez Posner

การเปลี่ยนแปลง de hough sous matlab เทdétecter plusieurs ellipses

คำตอบ:


11

ประการแรก Matlab มีการแปลงในตัวของ Hough : ไม่จำเป็นต้องบูรณาการล้อ

[H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);

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

BW = edge(Image,'canny');

ผลลัพธ์คือ \ theta อยู่ในช่วงองศาขณะที่พล็อตของคุณคือ (หรือ ) ดังนั้นลบองศา ( )0 < θ < 180 0 < θ < π 90 π / 290<θ<900<θ<1800<θ<π90π/2

มีความเป็นไปได้ที่คุณจะเลือกจุดสูงสุดผิดเพราะมียอดเขาใกล้เคียงที่อาจมีขนาดใหญ่กว่าในเมทริกซ์ตัวสะสม ในขณะที่มีอัลกอริทึมมากมายที่นี่เป็นสิ่งที่ฉันเคยเห็นใน Hough Transforms ในอดีต:

1) Define a region shape (typically its square) 
2) Define an accumulator threshold  
3) Select one pixel in the accumulator matrix
4) If it is a peak (i.e., larger than neighboring values above a threshold)
       a) look at the points within the region shape.
       b) If there is a larger value
              this is not a peak
          Else
              this is a peak
 5) Move to next pixel in accumulator matrix.

มองหา HoughLines เพื่อแสดงบรรทัดการแปลง hough ผลลัพธ์:

http://www.mathworks.com/help/toolbox/images/ref/houghlines.html

ผลของการใช้ Canny Edge Detector

การตรวจจับขอบอาจทำให้แต่ละด้านของสามเหลี่ยมเป็นสองเส้นได้

เป้าหมายของการตรวจจับขอบแสนรู้คือการผลิตขอบบาง / แคบที่สุดโดยใช้การลดค่าสูงสุด

การตรวจจับขอบ Canny ในเวลาสั้น ๆ (ที่มา: การประมวลผลภาพดิจิตอล, กอนซาเลซ)

1) Smooth input Image using a Gaussian Filter
2) Compute the Gradient magnitude and angle (Sobel, Perwitt or robert cross filters)
3) Apply Nonmaxima suppression (this is where the thinning happens) 
   a) Figure out which direction the edge is
   b) If the edge's magnitude is smaller than one of its two neighbors in the direction of the edge
          set the edge point to zero
      Else
          leave it alone
4) Use double thresholding and connectivity analysis to detect and link edges

ขอบคุณสำหรับการตอบกลับ. ฉันทำตั้งแต่เริ่มต้นเพื่อทำความเข้าใจให้ดีขึ้น การตรวจจับขอบแสนรู้ยังคงให้สามเหลี่ยม 2 รูป สำหรับขอบด้านในและด้านนอกสำหรับขอบด้านนอก ฉันเรียนรู้ทฤษฎีจากวิกิพีเดียซึ่งระบุว่าทีต้าคือ 0: pi ฉันรู้ว่าฟังก์ชันในตัวใช้ -pi / 2: pi / 2 แต่ไม่ควรมีความแตกต่างที่แท้จริง
waspinator

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

การตรวจจับขอบจะไม่สร้าง 2 บรรทัดที่คุณต้องการค้นหาเพียง 1 รายการหรือไม่ สิ่งที่พบจุดศูนย์กลางของเส้นหนาจะดีกว่า
endolith

@endolith รวมการอภิปรายเล็กน้อยของการตรวจจับขอบในโพสต์ต้นฉบับ
CyberMen

'ไม่จำเป็นต้องบูรณาการล้อ' บอกต่ออาจารย์ผู้สอนของฉัน ;-)
Nathan Schwermann

3
    if image(xi, yj) == 1 

ต้องเปลี่ยนเป็น

    if image(yj, xi) == 1 

สำหรับบรรทัดที่จะทำงานใน dehough


1

คำตอบที่ใช้ 3 ลูปนั้นน้อยกว่าค่าที่ดีที่สุดและสามารถปรับปรุงได้นี่คือแนวทาง / มุมมองที่ใช้งานง่ายขึ้น:

คู่ของจุดที่ถูกต้องทุกชุดที่ไม่ซ้ำกัน & B y = ax + bของ บรรทัดจะมีคู่จำนวนมากที่มีค่า a & b เหมือนกันดังนั้นจะมีบรรทัดที่ยาวเป็นจุดสูงสุด นี่เป็นความจริงสำหรับพิกัดเชิงขั้ว

แทนที่จะใช้แต่ละจุดแยกกันให้ใช้จุดเป็นคู่ หากคุณสามารถเก็บคะแนนทั้งหมด (โดยปกติจะเป็นเบาบาง) ในรายการแยกต่างหากจะดีกว่า แต่ก็ไม่จำเป็น

  1. จับคู่แต่ละคู่แล้วคำนวณ a & b (ปัดเศษเป็นค่าไม่ต่อเนื่อง)
  2. ไปที่สถานที่เฉพาะในอาร์เรย์และเพิ่ม 1

เส้นยาว -> จำนวนของคู่ที่มี a, b
คะแนนประปราย -> การนับจำนวนเล็กน้อยในเซลล์ที่ระบุ -> มากกว่าจะยุ่งเหยิง


อีกวิธีในการดูจากมุมมองเรดอน / โปรเจคทีฟ

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