5

イメージ内の曲がったコンベアを検出しようとしています。私はそれが示すように、その端部matlabで滑らかなカーブを検出する方法

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

を検出するためのハフ変換を使用して、次のコードを使用し、二つの直線が正常にコンベアの上部と下部のエッジを検出するが、私は検出する方法がわかりませんそれが曲がっているかどうか(写真の中では曲がっている)とその程度を計算する方法。

約下図(赤色)で手動で描かれた曲線:

enter image description here

私はこのような滑らかな曲線(例えば、2次多項式を検出するために、MATLABでハフ変換のためのコード又は機能は認められませんでした:y= a*x^2)。その他のソリューションも歓迎します。

それは、元の画像です: enter image description here

+0

元の画像をご提供いただけますか? – Tapio

+0

@タピオ画像を投稿に追加しました。 – Ahmad

+1

私はあなたが検出しようとしている画像のどのカーブを理解していません。手動で画像を描画し、探したいカーブを強調表示できますか? – Shai

答えて

3

コンベアベルトを検出し、あなたの直線を見ると、私はあなたが(行750画像950への)関心領域の周りにあなたの処理を集中することができ前提としています。その時点から
進み:

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 

選択領域の中央付近のみ強い水平エッジ画素

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

は、2度の多項式、これらエッジ点

[P, S, mu] = polyfit(col,row,2); 
[L, lS, lmu] = polyfit(col, row, 1); 
のラインにフィット

推定曲線をプロットする

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); 

結果が

enter image description here

であるあなたは、視覚的に第二度フィットPが良いコンベヤベルトの境界をどのように適合するかを理解することができます。最初の係数

>> P(1) 
ans = 
1.4574 

を見てあなたは、曲線のx^2の係数は曲線はっきりしませ直線を作る無視できないことがわかります。

+1

ありがとうございました!それがうまくいけば、私は他の答えを受けなければあなたのことを受け入れます。 – Ahmad

+0

'prewitt' 3 x 3行列に似ている15 x 50行列で' imfilter'を使用しました。この場合、水平エッジ検出に 'fspecial( 'prewitt')'を使用できない理由をお聞かせください。しかし私はそれをテストしたので、うまくいきません。 – Ahmad

+0

15 x 50は3 x 3ではありません。フィルタの背後にある理論的根拠は同じです:水平エッジを検出しますが、3x3の場合、画像の小さなエッジの影響を受ける非常に局所化された結果が得られます。非常に明確で大きな水平エッジのみを検出するために、フィルタはエッジを明確に検出するために50ピクセル幅の領域を平滑化します。フィルタサイズを5 x 50、または5 x 100に変更して、検出の精度にどのように影響するかを確認してください。 – Shai

関連する問題