5

Görüntüdeki bükülmüş bir konveyörü tespit etmeye çalışıyorum. Ben Hough Gösterildiği gibi başarıyla kenarlarınıMatlabdaki düzgün eğriler nasıl algılanır

%# load image, and process it 
I = imread('ggp\2.jpg'); 
g = rgb2gray(I); 
bw = edge(g,'Canny'); 

[H,T,R] = hough(bw); 

P = houghpeaks(H,500,'threshold',ceil(0.4*max(H(:)))); 

% I apply houghlines on the grayscale picture, otherwise it doesn't detect 
% the straight lines shown in the picture 
lines = houghlines(g,T,R,P,'FillGap',5,'MinLength',50); 
figure, imshow(g), hold on 

for k = 1:length(lines) 

    xy = [lines(k).point1; lines(k).point2]; 

    deltaY = xy(2,2) - xy(1,2); 
    deltaX = xy(2,1) - xy(1,1); 
    angle = atan2(deltaY, deltaX) * 180/pi; 
    if (angle == 0) 

     plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); 

     % Plot beginnings and ends of lines 
     plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow'); 
     plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');   
    end 
end 

enter image description here

algılamak için iki düz çizgiler dönüşümü konveyör üst ve alt kenarlarını algılar kullanarak aşağıdaki kodu kullanılmış ama algılamak nasıl bilmiyorum eğer eğilmiş veya eğilmemişse (resimde eğilmiş) ve bunun derecesini nasıl hesaplayacaksınız.

yaklaşık resimde (kırmızı renk) elle çizilir eğrisi:

enter image description here

Böyle düzgün eğriler (örneğin, 2. derece polinomların tespit etmek için Matlab'de dönüşümü Hough için bir kod ya da işlevi bulundu : y= a*x^2). Başka herhangi bir çözüm de açığız.

Bu orijinal görüntü var: enter image description here

+0

Bize orijinal resmi verebilir misiniz? – Tapio

+0

@Tapio Resmi ekledim. – Ahmad

+1

Görüntüdeki hangi eğriyi algılamaya çalıştığınızı anlamıyorum. Görüntü üzerinde manuel olarak çizim yapabilir ve bulmak istediğiniz eğriyi vurgulayabilir misiniz? – Shai

cevap

3

taşıma bandı tespit senin düz çizgiler baktığımızda, sana (satırlar 750 görüntüde 950) ilgilenilen bölgenin etrafında işleme odaklanabilirsiniz varsayalım. bu noktadan sonra
İşlem,: bölgenin merkezi etrafında

oimg = imread('http://i.stack.imgur.com/xfXUS.jpg'); %// read the image 
gimg = im2double(rgb2gray(oimg(751:950, :, :))); %// convert to gray, only the relevant part 
fimg = imfilter(gimg, [ones(7,50);zeros(1,50);-ones(7,50)]); %// find horizontal edge 

seçin sadece güçlü yatay kenar piksel

[row, col] = find(abs(fimg)>50); 
sel = row>50 & row < 150 & col > 750 & col < 3250; 
row=row(sel); 
col=col(sel); 

bu kenar noktalarına 2. derece polinom ve doğrusunu yerleştirin

[P, S, mu] = polyfit(col,row,2); 
[L, lS, lmu] = polyfit(col, row, 1); 

Tahmini eğriler Çizgili

xx=1:4000; 
figure;imshow(oimg,'border','tight'); 
hold on; 
plot(xx,polyval(P,xx,[],mu)+750,'LineWidth',1.5,'Color','r'); 
plot(xx,polyval(L,xx,[],lmu)+750,':g', 'LineWidth', 1.5); 

sonuç

enter image description here

Sen P fit 2. derece iyi konveyör bant sınırını nasıl uyduğunu görsel takdir olduğunu. İlk katsayısı

>> P(1) 
ans = 
1.4574 

baktığımızda Sen eğrinin x^2 katsayısı eğrisi belirgin değil düz bir çizgi yapım ihmal edilemez olduğunu görüyoruz.

+1

Çok teşekkür ederim! İşe yaramıyorsa, başka bir cevap almazsam seninkini kabul edeceğim. – Ahmad

+0

'ön filtreli '3 x 3 matrisine benzeyen 15 x 50 matrisli' imfilter' kullandınız. Bu durumda yatay kenar algılama için neden fspecial ('prewitt') 'kullanamadığımı söyler misiniz? Ancak ben bunu test ettim, işe yaramıyor. – Ahmad

+0

15 x 50, 3 x 3 DEĞİLDİR. Filtrelerin ardındaki mantık aynıdır: yatay kenarı algılama, ancak 3'e 3 ile görüntüdeki küçük kenarlardan etkilenen çok yerel sonuç elde edersiniz.Sadece çok farklı ve geniş yatay kenarları tespit etmek için filtre, kenarları belirgin bir şekilde algılamak için 50 piksel genişliğinde bir alanı düzeltir. Filtre boyutunu 5 x 50 veya 5 x 100 olarak değiştirebilir ve algılamanın doğruluğunu nasıl etkilediğini görebilirsiniz. – Shai