MATLAB でのイメージ エッジ検出にソーベル オペレーターを使用する

Mehak Mubarik 2023年6月20日
MATLAB でのイメージ エッジ検出にソーベル オペレーターを使用する

MATLAB でエッジ検出画像処理の Sobel メソッドを使用するさまざまな方法を見ていきます。 さまざまなサンプル コードと関連する出力を使用して、概念を明確にし、MATLAB でのエッジ検出画像処理技術の Sobel メソッドを完全に理解できるようにします。

エッジ検出には、画像の強度が急激に変化するか、むしろ正確には不連続性が含まれるコンピューター化された画像の境界と輪郭を見つけるためのさまざまな分析アプローチが含まれることに注意してください。

ステップ検出は 1 次元信号の不連続性を識別し、変化検出は信号の不規則性を識別します。

エッジ検出は、視覚分析、マシン ビジョン、オブジェクト認識、特にオブジェクトの認識と分離における強力な手法です。 Sobel、Canny、Prewitt、Roberts、および Fuzzy 論理アプローチは、顕著なエッジ検出手法です。

Sobel 演算子を最初から使用して、MATLAB でイメージ エッジを検出する

Sobel–Feldman 演算子または Sobel フィルターとしても知られる Sobel 演算子は、画像およびビデオ処理、特にエッジ検出技術で使用できます。 エッジを強調した画像を生成します。

スタンフォード人工知能研究所の共同研究者である Irwin Sobel と Gary Feldman (SAIL) にちなんで命名されました。 1968 年、ソーベルとフェルドマンは SAIL で等方性 3x3 画像勾配演算子の概念を導入しました。

離散微分演算子は、画像強度曲線のおおよその勾配を計算します。 Sobel–Feldman 演算は、画像内のすべての位置で一致する勾配ベクトルまたはこのベクトルの法線 を生成します。

Sobel–Feldman 演算子は、小さな分離可能な整数値フィルターを使用して画像を水平方向および垂直方向に畳み込むことに基づいているため、計算コストが低くなります。 ただし、生成される勾配近似は、特に画像の高周波変動の場合、非常に貧弱です。

次の例を見て、この概念を理解しましょう。

コード例:

Aimage=imread('peppers.png');
imshow(Aimage)
Bimage=rgb2gray(Aimage);

Cimage=double(Bimage);

for k=1:size(Cimage,1)-2
for l=1:size(Cimage,2)-2
%Sobel mask for x-direction:
G_x=((2*Cimage(k+2,l+1)+Cimage(k+2,l)+Cimage(k+2,l+2))-(2*Cimage(k,l+1)+Cimage(k,l)+Cimage(k,l+2)));
%Sobel mask for y-direction:
G_y=((2*Cimage(k+1,l+2)+Cimage(k,l+2)+Cimage(k+2,l+2))-(2*Cimage(k+1,l)+Cimage(k,l)+Cimage(k+2,l)));
%The gradient of the image
%B(i,j)=abs(Gx)+abs(Gy);
Bimage(k,l)=sqrt(G_x.^2+G_y.^2);
end
end
figure,
imshow(Bimage);
title('Sobel gradient Image');

出力:

ソーベル画像 1

ソーベル画像 2

エッジ検出画像は、カットオフ/しきい値設定を利用して ソーベル 勾配から取得することができます。 代わりに、Sobel 勾配比率が基準レベルより小さい場合、しきい値レベルが適用されます。

f が臨界しきい値に等しい場合、f は事前定義されたカットオフに等しくなります。

コード例:

Aimage=imread('peppers.png');
imshow(Aimage)
Bimage=rgb2gray(Aimage);

Cimage=double(Bimage);

for k=1:size(Cimage,1)-2
for l=1:size(Cimage,2)-2
%Sobel mask for x-direction:
G_x=((2*Cimage(k+2,l+1)+Cimage(k+2,l)+Cimage(k+2,l+2))-(2*Cimage(k,l+1)+Cimage(k,l)+Cimage(k,l+2)));
%Sobel mask for y-direction:
G_y=((2*Cimage(k+1,l+2)+Cimage(k,l+2)+Cimage(k+2,l+2))-(2*Cimage(k+1,l)+Cimage(k,l)+Cimage(k+2,l)));
%The gradient of the image
%B(i,j)=abs(Gx)+abs(Gy);
Bimage(k,l)=sqrt(G_x.^2+G_y.^2);
end
end
figure,
imshow(Bimage);
title('Sobel gradient Image');

%Define a threshold value
Thresholdd=100;
Bimage=max(Bimage,Thresholdd);
Bimage(Bimage==round(Thresholdd))=0;

Bimage=uint8(Bimage);
figure,
imshow(Bimage);
title('Edge detected Image');

ここで、なぜ i=1:size (C,1) -2j=1:size (C,2) -2 で 2 を引いたのかという疑問が生じます。 これは、すべての (i,j)th 位置から 3x3 フレームが生成されるためです。

2 を削除することで、数値を境界内に保つことができます。 その境界は、ソース ピクチャ マトリックスの要素 C(i,j) を見ていると仮定して、Sobel 3x3 水平マスクと画像マトリックスの畳み込みの結果です。

Gx 行列の対応するコンポーネント Gx(i,j) を取得するには、要素 C(i,j)C(i,j) の周囲の 8つの近傍を選択し、それぞれを乗算します。 Sobel マスクの対応する要素によってそれらを追加し、結果を追加します: C(i-1,j-1) * S(1,1)+C(i-1,j) * S(1,2) * C(i-1,j+1) * S(1,3)+.. (ここでは 9 回の乗算)。

出力:

ソーベル画像 1

ソーベル画像 2

ソーベル画像 3

著者: Mehak Mubarik
Mehak Mubarik avatar Mehak Mubarik avatar

Mehak is an electrical engineer, a technical content writer, a team collaborator and a digital marketing enthusiast. She loves sketching and playing table tennis. Nature is what attracts her the most.

LinkedIn