2013-05-10 20 views
12

İkili bir görüntüde ızgara var (döndürülebilir). MATLAB kullanarak bu ızgara için yaklaşık formülü nasıl öğrenebilirim?Matlabdaki ızgara saptaması

Örnek resim:

http://www.pami.sjtu.edu.cn/people/wyg/images/print5.jpg

Bazen bu siyah noktalar eksik, bu yüzden formülü veya bu siyah noktalar olası merkezini tahmin etmek ‘bir yol’ gerekir.

Ben regionprops kullanarak denedi, benim bu siyah noktalar var merkezini almak için yardımcı olabilir, ancak hiçbir fikri siyah noktalar bir bir yol x ve y üzerinde 1D fft kullanıyor burada

clear all 
im = imread('print5.jpg'); 
im = im2bw(im); 
[sy,sx] = size(im); 
im = imcomplement(im); 
im(150:200,100:150) = 0; % let some dots missing! 
im = imclearborder(im); 
st = regionprops(im, 'Centroid'); 

imshow(im) hold on; 
for j = 1:numel(st) 
    px = round(st(j).Centroid(1,1)); 
    py = round(st(j).Centroid(1,2)); 
    plot(px,py,'b+') 
end 
+1

deneyin tuvalet: ızgara xy eksenleri ile hizalı olacak şekilde görüntü geri döndürülen kral reklam frekans içeriği: 'fft2' ızgara çok düzenli, frekans alanında pikler nokta mümkün olmalıdır. – Shai

+5

Yukarıdaki yorumlardaki tüm bilgileri sorgunuza düzenlerseniz, tekrar açılmasını sağlayabilirsiniz. –

+5

vay, bu kısa bir süre içinde çok sayıda downvotlar çekti. Neden kapatıldığını anladım, ama gerçekten hak ettim -20 downvotes ... – Amro

cevap

38

eksik olursa projeksiyon:

m=double(imread('print5.jpg')); 
m=abs(m-max(m(:))); % optional line if you want to look on the black square as "signal" 
H=fspecial('gaussian',7,1); 
m2=conv2(m,H,'same'); 

sonra ff alacağım:

Birincisi, görüntüyü biraz bulanıklık olacak bir Gauss ile evriştirerek yüksek frekans gürültüsünde azalma her bir eksenin bir çıkıntının t:

delta=1; 
N=size(m,1); 
df=1/(N*delta);  % the frequency resolution (df=1/max_T) 
f_vector= df*((1:N)-1-N/2);  % frequency vector 

freq_vec=f_vector; 
fft_vecx=fftshift(fft(sum(m2))); 
fft_vecy=fftshift(fft(sum(m2'))); 
plot(freq_vec,abs(fft_vecx),freq_vec,abs(fft_vecy)) 

enter image description here

Bu yüzden, her iki eksen 1/0,07422 piksel ya da ~ 13.5 piksel bir süre çevirmek 0.07422 bir tepe verim görebilir.

ml= log(abs(fftshift (fft2(m2)))+1); 
imagesc(ml) 
colormap(bone) 

enter image description here

ve sen, sen alabilirsiniz istiyorsanız o zaman bu tür basit geometri veya regionprops gibi araçları geçerlidir:

da açı bilgi almak için daha iyi bir yolu 2D gitmektir, yani karelerin açısı ve büyüklüğü. Karenin boyutu 1/arka plan üzerinde büyük döndürülmüş kare boyutu (görüntü bulanık bu yüzden bu yüzden bunu bulanıklaştırmak için biraz bulanık), ve açı atan(y/x) olduğunu. Kareler arasındaki mesafe 1/orta kısımdaki güçlü zirveler arasındaki mesafe görüntü merkezine.

böylece eşik ml düzgün görüntü

imagesc(ml>11) 

bunun için merkez zirveleri erişebilir söylemişse ...

henüz başka bir yaklaşım örneğin bir ikili görüntü üzerinde morfolojik operasyon olacak Bulanık görüntüyü eşleştiriyorum ve nesneleri noktalara küçültüyorum. deliksiz nesneler bir noktaya küçültmek böylece pikselleri kaldırır:

BW=m2>100; 
BW2 = bwmorph(BW,'shrink',Inf); 
figure, imshow(BW2) 

enter image description here

Sonra pratikte kafes sitesi ızgara başına bir piksel var! böylece Izgara çizgilerini tespit etmek için Hough transform geçerli olabilir

26

... vb, Hough dönüşümü kullanılarak Amro çözüm onu beslemek veya fft ile analiz edebilir veya bir blok sığabilir.Biz bu sahip olduktan sonra ızgara yerleri ve rotasyon açısını çıkarabiliriz:

%# load image, and process it 
img = imread('print5.jpg'); 
img = imfilter(img, fspecial('gaussian',7,1)); 
BW = imcomplement(im2bw(img)); 
BW = imclearborder(BW); 
BW(150:200,100:150) = 0; %# simulate a missing chunk! 

%# detect dots centers 
st = regionprops(BW, 'Centroid'); 
c = vertcat(st.Centroid); 

%# hough transform, detect peaks, then get lines segments 
[H,T,R] = hough(BW); 
P = houghpeaks(H, 25); 
L = houghlines(BW, T, R, P); 

%# show image with overlayed connected components, their centers + detected lines 
I = imoverlay(img, BW, [0.9 0.1 0.1]); 
imshow(I, 'InitialMag',200, 'Border','tight'), hold on 
line(c(:,1), c(:,2), 'LineStyle','none', 'Marker','+', 'Color','b') 
for k = 1:length(L) 
    xy = [L(k).point1; L(k).point2]; 
    plot(xy(:,1), xy(:,2), 'g-', 'LineWidth',2); 
end 
hold off 

(I Dosya Exchange imoverlay fonksiyonunu kullanıyorum)

sonucu:

grid_lines_overlayed

Burada vurgulanan satırlara karşılık gelen tepe noktalarına sahip akümülatör matrisi:

Burada

%# filter lines to extract almost vertical ones 
%# Note that theta range is (-90:89), angle = theta + 90 
LL = L(abs([L.theta]) < 30); 

%# compute the mean slope of those lines 
slopes = vertcat(LL.point2) - vertcat(LL.point1); 
slopes = atan2(slopes(:,2),slopes(:,1)); 
r = mean(slopes); 

%# transform image by applying the inverse of the rotation 
tform = maketform('affine', [cos(r) sin(r) 0; -sin(r) cos(r) 0; 0 0 1]); 
img_align = imtransform(img, fliptform(tform)); 
imshow(img_align) 

:

accumulator_peaks


Şimdi iki yönde (Düşeyleri veya temaları) birinde kişilerce süzüldü tespit hatlarının ortalama eğim, hesaplayarak dönme açısı kurtarabilir

aligned_img