4

私は、自動溶接プロセスのために溶接画像のシームを検出しようとしています。 enter image description here 元の画像に検出された線(目的の画像の赤い線)のピクセル位置を探したいと思います。matlabでの画像の自律縫い検出

私は次のコードを使用し、最後に画像からノイズを除去して下の結果に到達しました。

clc,clear,clf; 
im = imread('https://i.stack.imgur.com/UJcKA.png'); 
imshow(im);title('Original image'); pause(0.5); 
sim = edge(im, 'sobel'); 
imshow(sim);title('after Sobel'); pause(0.5); 
mask = im > 5; 
se = strel('square', 5); 
mask_s = imerode(mask, se); 
mask(mask_s) = false; 
mask = imdilate(mask, se); 
sim(mask) = false; 
imshow(sim);title('after mask');pause(0.5); 
sim= medfilt2(sim); 
imshow(sim);title('after noise removal') 

enter image description here

残念ながら完全に縫い目を見つけるために、画像に残っているものは何もありません。

ご協力いただければ幸いです。

Downloadオリジナル画像。

+2

あなただけのターゲットオブジェクト間<300×300の解像度を持っていない理由?なぜイメージはとても畏敬の念を抱いていますか?そのレーザー三角測量の出力か何ですか? ノイズを除去するための最後のステップとして、1〜2ピクセルのラインでメディアンフィルタを使用すると、何をしているのか全くわからないことがわかります。あなたが進む画像処理についての基本的な知識をお持ちください。 – Piglet

+0

事前に継ぎ目のおおよその形状を知っていますか?または、1つの画像につき1つのシームがあるだけですか?その他の有用な制約? – Cecilia

+0

@セシリア画像あたり1つの継ぎ目があります。プレゼンテーションには – asys

答えて

3

フィルタをノイズに対してより堅牢にする必要があります。これはそれをより大きな支援を与えることによって行うことができます。

filter = [ones(2,9);zeros(1,9);-ones(2,9)]; 
msk = imerode(im > 0, ones(11)); % only object pixels, discarding BG 
fim =imfilter(im,filter); 
robust = bwmorph((fim>0.75).*msk,'skel',inf); % get only strong pixels 

堅牢なマスクは次のようになります。あなたが見ることができるように

enter image description here

、シームラインがうまく検出され、私たちは選択する必要がありその最大の連結成分として:

st = regionprops(bwlabel(robust,8), 'Area', 'PixelList'); 
[ma mxi] = max([st.Area]); % select the region with the largest area 

今は思えるのポリゴン(第2度)をフィットすることができます

pp=polyfit(st(mxi).PixelList(:,1), st(mxi).PixelList(:,2), 2); 

そして、ここでは、画像の上にある:

imshow(im, 'border','tight');hold on; 
xx=1:size(im,2);plot(xx,polyval(pp,xx)+2,'r'); 

enter image description here

+2 Yは、フィルタ幅に起因するオフセット。


PS、
あなたはthis threadは、関連するかもしれません。

3

Shaiはすばらしい答えですが、ノイズフィルタリングが機能しない理由をもう少し詳しく説明したいと思います。

メディアンフィルタリングは

Wikipedia動作しないのはなぜあなたがそれを使用することを選択したかもしれない理由である、エッジを保存しながら、メディアンフィルタは、ノイズを除去することを示唆しています。しかし、あなたのケースでは、それはほとんど確実に動作しません、理由は次のとおりです:

画像全体にウィンドウをスライドさせます。各領域では、中央のピクセルを周囲のウィンドウの中央値に置き換えます。 medfilt2はデフォルトで3x3ウィンドウを使用します。中央値は0である。この

[0 0 0 
    1 1 1 
    0 0 0] 

のように見えます[212 157]の周りの3x3のブロック

Location of window

、のは、あなたのラインの近くに3×3のブロックを見てみましょう!したがって、線分の途中にあっても、ピクセルはフィルタリングされます。

ノイズを除去するためのシャイの方法ではなく、画素の最大接続されたグループを見つけ、ピクセルの小グループを無視メディアンフィルタの代替。これらの小さなグループを画像から削除したい場合、Matlabはバイナリ画像から小さなオブジェクトを削除するフィルタbwareaopenを提供します。

たとえば、あなたはあなたのラインが

sim= bwareaopen(sim, 4); 

sim= medfilt2(sim); 

を交換する場合、結果ははるかに優れて

after noise removal

代替エッジ検出器

最後に、Shaiは水平勾配フィルタを使用して画像内の水平エッジを見つけます。それはあなたのエッジが水平なので素晴らしい作品です。エッジが常に水平であるとは限りませんが、別のエッジ検出方法を使用することもできます。元のコードでは、Sobelを使用しますが、Matlabでは多くのオプションが用意されています。一例として、次の画像では、4つの異なるエッジ検出器を使用して、コードによって選択されたピクセル(bwareaopen変更あり)を強調表示しました。

Detector comparison

+0

非常に良い説明。 1つの注記は、**エッジ**検出と**リッジ**検出の違いに注目しながら価値があります。元の画像を見ると、継ぎ目は**エッジ**です。エッジ検出フィルタを適用した後、エッジピクセルはエッジマップの**リッジ**を形成します。したがって、元の画像にメジアンフィルタを適用するとノイズが減少し、エッジが強調されることがありますが、エッジマップにメジアンフィルタを適用すると**尾根**がなくなり、エッジ検出がずっと困難になります。 – Shai

関連する問題