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:
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?
matlab
hough-transform
waspinator
sumber
sumber
Jawaban:
Pertama, Matlab memiliki Built in Hough Transform : tidak perlu menemukan kembali roda.
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
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:
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)
sumber
perlu diubah menjadi
untuk garis untuk bekerja di dehough
sumber
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.
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.
sumber