Bantu memahami transformasi Hough

19

Saya mencoba untuk mendapatkan transformasi Hough untuk bekerja di MATLAB, tapi saya mengalami masalah. Saya memiliki cara yang sangat buruk untuk mendeteksi puncak yang perlu diperbaiki, tetapi sebelum itu saya harus dapat membalikkan transformasi hough untuk membuat garis lagi dengan benar. Ini adalah jenis barang yang saya dapatkan sekarang:

masukkan deskripsi gambar di sini

Sepertinya diputar oleh 90 derajat, tapi saya tidak yakin mengapa. Saya tidak yakin apakah itu ruang Hough saya yang salah, atau apakah itu cara saya de-Hough dan menggambar garis. Dapatkah seseorang membantu meningkatkan deteksi puncak saya? Gambar yang digunakan dalam kode ada di sini

%% 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

Tertaut: Bagaimana melakukan De-Houghing dari Hough Transform'ed Image?

waspinator
sumber
Apakah Anda berhasil menyelesaikan masalah Anda? saya menghadapi masalah serupa. terima kasih
Erez Posner
transformation de hough sous matlab pour détecter plusieurs ellipses

Jawaban:

11

Pertama, Matlab memiliki Built in Hough Transform : tidak perlu menemukan kembali roda.

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

Meskipun gambar Anda tidak perlu deteksi tepi, Anda dapat meningkatkan waktu pemrosesan dan efektivitas algoritma saya menggunakannya. Segitiga Anda memiliki daerah gemuk berwarna putih dan hitam. Idealnya, segitiga akan setebal 1px menandai tepi segitiga. Gunakan Canny Edge Detection

BW = edge(Image,'canny');

-90<θ<900<θ<1800<θ<π90π/2

Ada potensi bagi Anda untuk memilih puncak yang salah karena ada puncak tetangga yang mungkin lebih besar dalam matriks akumulator. Meskipun ada banyak algoritma di sini adalah salah satu yang pernah saya lihat digunakan di Hough Transforms di masa lalu:

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.

Lihatlah ke HoughLines untuk menampilkan garis hough transform, hasil:

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

Efek Menggunakan Canny Edge Detector

Deteksi Tepi berpotensi mengubah setiap sisi segitiga menjadi dua garis.

Tujuan deteksi tepi cerdik adalah untuk menghasilkan tepi tipis / sempit maksimal dengan menggunakan supresi nonmaksimal

Canny Edge Detection in a Singkatnya (Sumber: Pemrosesan Gambar Digital, Gonazalez)

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
CyberMen
sumber
Terima kasih balasannya. Saya melakukannya dari awal untuk memahaminya dengan lebih baik. deteksi tepi cerdik masih memberikan 2 segitiga. satu untuk tepi dalam, dan keluar untuk tepi luar. Saya belajar teori dari wikipedia, yang menyatakan bahwa theta adalah 0: pi. Saya tahu bahwa fungsi bawaan menggunakan -pi / 2: pi / 2, tetapi seharusnya tidak ada perbedaan nyata?
waspinator
Langsung dari kelelawar, kisaran seharusnya tidak membuat perbedaan. (dapatkah Anda memberi tahu perbedaan antara garis yang telah diputar 180 derajat?) NAMUN, ini membuat perbedaan jika Anda menggunakan transformasi hough untuk algoritme koreksi gambar. (Ini akan berarti perbedaan antara gambar sisi kanan atas dan sisi atas)
CyberMen
Tidakkan deteksi tepi menghasilkan 2 baris di mana Anda ingin menemukan hanya 1? Sesuatu yang menemukan pusat garis tebal akan lebih baik.
endolith
@endolith Termasuk sedikit diskusi tentang deteksi tepi dalam posting asli
CyberMen
'tidak perlu menemukan kembali roda'? Katakan itu kepada instruktur saya ;-)
Nathan Schwermann
3
    if image(xi, yj) == 1 

perlu diubah menjadi

    if image(yj, xi) == 1 

untuk garis untuk bekerja di dehough

waspinator
sumber
1

Jawaban menggunakan 3 loop kurang optimal dan dapat ditingkatkan, di sini lebih dari pendekatan intuitif / sudut pandang:

Setiap pasangan poin yang valid menetapkan a & b unik y = ax + b. Garis akan memiliki banyak pasangan dengan nilai a & b yang sama, sehingga garis panjang akan hadir sebagai puncak. Ini juga berlaku untuk koordinat r & teta kutub.

Alih-alih memperlakukan setiap titik secara terpisah, gunakan pasangan titik. Jika Anda dapat menyimpan semua (biasanya jarang) poin dalam daftar terpisah itu lebih baik, tetapi itu bukan keharusan.

  1. Ambil setiap pasangan & hitung a & b. (dibulatkan ke nilai diskrit)
  2. Pergi ke tempat spesifik dalam array dan tambahkan 1.

Garis panjang -> banyak pasangan dengan a, b.
Poin sporadis -> penghitungan kecil dalam sel tertentu -> lebih seperti kekacauan.


Cara lain untuk melihatnya adalah dari sudut pandang Radon / proyektif.

  • Garis akan memproyeksikan kuat ke "garis pengumpul" tegak lurus sehingga memiliki skor tinggi.
  • Jika sudut antara garis dan "garis pengumpul" tidak 90 derajat atau garis pengumpul tidak mengumpulkan semua titik garis yang diproyeksikan ke "garis pengumpul" ini, akan ada skor yang lebih rendah.
Ilan sinai
sumber