Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

イメージの勾配のノイズの低減

この例では、イメージの勾配の計算に関連するノイズの低減方法を説明します。イメージの勾配は、イメージ内で関心のある特徴を強調表示するために使用したり、エッジ検出やコーナー検出などの多くの特徴検出アルゴリズムで使用します。勾配の計算でノイズを低減することは正確な特徴の検出に重要です。

イメージをワークスペースに読み取ってグレースケールに変換します。

originalImage = imread("yellowlily.jpg");
originalImage = im2gray(originalImage);

imshow(originalImage)

Figure contains an axes object. The axes object contains an object of type image.

この例では、ノイズをシミュレートするために、イメージにいくらかのガウス ノイズを加えます。

noisyImage = imnoise(originalImage,"gaussian");
imshow(noisyImage)

Figure contains an axes object. The axes object contains an object of type image.

関数 imgradient や関数 imgradientxy を使用して勾配の大きさを計算します。imgradient は勾配の大きさと方向を検出し、imgradientxy はイメージの方向勾配を検出します。

sobelGradient = imgradient(noisyImage);
imshow(sobelGradient,[])
title("Sobel Gradient Magnitude")

Figure contains an axes object. The axes object with title Sobel Gradient Magnitude contains an object of type image.

勾配の大きさを表すイメージを見ると、イメージの勾配のノイズがかなり大きいことは明らかです。勾配を計算する前に平滑化を行うと、ノイズの影響を最小化できます。imgradient はソーベル勾配演算子を使用し、少量のノイズに対してこの機能を既に提供しています。ソーベル勾配演算子は、以下に示すように、3 行 3 列のフィルターです。これらは関数 fspecial を使用して生成できます。

hy = -fspecial("sobel")
hy = 3×3

    -1    -2    -1
     0     0     0
     1     2     1

hx = hy'
hx = 3×3

    -1     0     1
    -2     0     2
    -1     0     1

hy フィルターは水平方向の平滑化を行いながら、垂直方向の勾配を計算します。hx は垂直方向の平滑化を行い、水平方向の勾配を計算します。"Prewitt" 法および "Roberts" 法のオプションもこの機能を備えています。

ソーベル、ロバーツ、またはプレウィットの勾配演算を使用しても、イメージの勾配のノイズが大きすぎる場合があります。これを解決するには、イメージの勾配を計算する前にガウス平滑化フィルターを使用してイメージを平滑化します。イメージの平滑化に関数 imgaussfilt を使用します。ガウス フィルターの標準偏差により平滑化の範囲が変わります。ガウス フィルターで平滑化を処理するので、中心差分勾配や中間差分勾配の演算が使用できます。

sigma = 2;
smoothImage = imgaussfilt(noisyImage,sigma);
smoothGradient = imgradient(smoothImage,"CentralDifference");
imshow(smoothGradient,[])
title("Smoothed Gradient Magnitude")

Figure contains an axes object. The axes object with title Smoothed Gradient Magnitude contains an object of type image.

参考

| | |

関連するトピック