(デジタル画像処理 MATLAB+Python) 第 7 章 画像の鮮明化 - セクション 3: ガウス フィルターとエッジ検出

1: ガウス関数

(1) 定義

ガウス関数: これは一般的な連続関数であり、通常は記号G ( x ) G(x)が使用されます。G ( x )を意味します。次の式で定義できます

G ( x ) = 1 σ 2 π e − x 2 2 σ 2 G(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{x^{2}} {2\シグマ^{2}}}G ( × )=p午後2時 1e2P _2バツ2

その中で××xは独立変数σ \sigmaσは、ガウス関数の標準偏差を表す正の実数です。ガウス関数には次の特性があります。

  • ガウス関数は偶関数です。つまり、G ( − x ) = G ( x ) G(-x) = G(x) です。G ( x )=G ( × )
  • ガウス関数の曲線は釣鐘型でx = 0 x=0です。バツ=0を指定するとピーク値が取得されます。標準偏差σ \sigmaσが小さいほど、ガウス関数のピークは高くなり、曲線は急になります。標準偏差σ \sigmaσが大きいほど、ガウス関数のピークは低くなり、曲線は緩やかになります。
  • ガウス関数の面積は1 11,すなわち∫ − ∞ ∞ G ( x ) dx = 1 \int_{-\infty}^{\infty} G(x) dx = 1G ( x ) d x=1
  • σ \sigmaσ は0 0になる傾向があります0の場合、ガウス関数のピーク値は無限大に近づき、曲線はますます急勾配になり、δ \deltaδ関数。δ \deltaデルタ関数は、独立変数が0 0に等しい場合のインパルスに似た関数です。0の場合、関数値は無限大ですが、他の位置では関数値は0 00

以下はガウス関数とその一次導関数形式です。
ここに画像の説明を挿入

以下はガウス関数の二次導関数の形式です。

ここに画像の説明を挿入

(2) 特長

ここに画像の説明を挿入

  • 原点から遠ざかるにつれて重みは徐々にゼロに減少します。これは、中心に近い画像値が遠くにある画像値よりも重要であることを示しています。
  • 標準偏差σ \sigmaσ は近傍の範囲を決定します。総重みの 95% は2 σ 2\sigmaに含まれます。中間範囲
  • 2 次導関数には、負の関数値を持つ滑らかな中央オーバーハングと、正の値を持つ 2 つの滑らかなサイド オーバーハングがあります。
  • − σ -\sigmaでのゼロクロスσ+ σ +\sigma+ σ、およびg ( x ) g(x)g ( x )g ' ( x ) の変曲点 g^{\prime}(x)g' (x)の極値点は
  • 1D 形式は垂直軸を中心に回転され、2D 関数形式が等方性(原点を通過する接平面上に同じ 1D ガウス断面が存在する) になり、その二次導関数形式はソンブレロまたはソンブレロのようなものになります。
  • 数学的導出から、ハットのキャビティエッジz = g ( x , y ) z=g(x,y)z=g ( x ,y )軸方向、表示およびフィルタリングのアプリケーションでは、キャビティの口は通常下を向いています。つまり、中央の突出部分が正、キャップの端が負です。

2: LOG 演算子

(1) 定義

LOG 演算子: Marr は、最初にガウス関数を使用して画像を平滑化し、次にラプラシアン演算子を使用してエッジを検出します (LOG フィルターと呼ばれます)。

LoG ⁡ ( x , y ) = 1 π σ 4 [ 1 − x 2 + y 2 2 σ 2 ] e − x 2 + y 2 2 σ 2 \operatorname{LoG}(x, y)=\frac{1} {\pi \sigma^{4}}\left[1-\frac{x^{2}+y^{2}}{2 \sigma^{2}}\right] e^{-\frac{x ^{2}+y^{2}}{2 \sigma^{2}}}Log ( x ,y )=p.p _41[ 12P _2バツ2+y2e2P _2バツ2 +y2

LOG 演算子は、ガウス関数とラプラシアン演算子 (つまり、二次導関数演算子) を組み合わせたものと見なすことができるため、その出力は、元の画像のラプラス変換とガウス フィルター処理の結果になります。画像内のエッジやコーナーなどの特徴を検出するために使用できます。GGしますgとイメージ関数fff畳み込み、滑らかな画像関数を取得し、関数に対してラプラシアン演算を実行し、エッジを抽出します

証明できる

∇ 2 [ f ( x , y ) ∗ g ( x , y ) ] = f ( x , y ) ∗ ∇ 2 g ( x , y ) \nabla^{2}[f(x, y) * g(x , y)]=f(x, y) * \nabla^{2} g(x, y)2 [f(x,y )g ( x ,y )]=f ( x ,y )2g (×_y )

∇ 2 g ( x , y ) = ∂ 2 g ∂ x 2 + ∂ 2 g ∂ y 2 = 1 π σ 4 ( x 2 + y 2 2 σ 2 − 1 ) exp ⁡ ( − x 2 + y 2 2 σ 2 ) \nabla^{2} g(x, y)=\frac{\partial^{2} g}{\partial x^{2}}+\frac{\partial^{2} g}{\partial y^{2}}=\frac{1}{\pi \sigma^{4}}\left(\frac{x^{2}+y^{2}}{2 \sigma^{2}}- 1\right) \exp \left(-\frac{x^{2}+y^{2}}{2 \sigma^{2}}\right)2g (×_y )=×22g _+∂y _22g _=p.p _41(2P _2バツ2+y21 )経験値(2P _2バツ2+y2)

∇ 2 g ( x , y ) \nabla^{2}g(x,y)2g (×_y )は、Marr-Hildrech 演算子としても知られる LOG フィルターです。

  • σ \シグマσはスケール係数です。大きな値を使用すると、ぼやけたエッジを検出でき、小さな値を使用すると、焦点の合った画像の詳細を検出できます。

LOG 演算子の形状を次の図に示します。

ここに画像の説明を挿入

フィルターのサイズはσ \sigmaで与えられます。σの数値、または同等のω 2 D \omega_{2D}おお2D_ _決定する値。関数が過度に切り詰められないようにするために、計算は十分に大きなウィンドウで実行する必要があり、ウィンドウ幅は通常ω ≥ 3.6 ω 2 D \omega \geq 3.6\omega_{2D}と見なされます。おお3.6 °2D_ _

σ \sigmaσ が異なる値をとる場合、異なるテンプレートに対応します。
ここに画像の説明を挿入

(2) プログラム

ここに画像の説明を挿入


MATLAB の実装:

Image=im2double(rgb2gray(imread('lotus.jpg')));
figure,imshow(Image),title('原图像');
H=fspecial('laplacian',0);
R=imfilter(Image,H);
edgeImage=abs(R);
figure,imshow(edgeImage),title('Laplacian梯度图像');
H1=[0 -1 0;-1 5 -1;0 -1 0];
sharpImage=imfilter(Image,H1);
figure,imshow(sharpImage),title('Laplacian锐化图像');


Python の実装:

import cv2
import matplotlib.pyplot as plt
import numpy as np

# 读入图像
Image = cv2.imread('lotus.jpg')
Image = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)
Image = Image.astype(np.float64) / 255.0

# 显示原图像
plt.imshow(Image, cmap='gray')
plt.title('原图像')
plt.show()

# 计算Laplacian梯度图像
H = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]], dtype=np.float64)
R = cv2.filter2D(Image, -1, H)
edgeImage = np.abs(R)

# 显示Laplacian梯度图像
plt.imshow(edgeImage, cmap='gray')
plt.title('Laplacian梯度图像')
plt.show()

# 计算Laplacian锐化图像
H1 = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], dtype=np.float64)
sharpImage = cv2.filter2D(Image, -1, H1)

# 显示Laplacian锐化图像
plt.imshow(sharpImage, cmap='gray')
plt.title('Laplacian锐化图像')
plt.show()

3:キャニーオペレーター

(1) 最適なエッジ検出

最適エッジ検出: すべてのエッジ検出アルゴリズムの中で最良のエッジ検出結果が得られるアルゴリズムを指します。ただし、さまざまな種類の画像やさまざまなアプリケーション シナリオに適したアルゴリズムが異なるため、すべての状況で最適に実行できるエッジ検出アルゴリズムはありません。したがって、特定の状況に応じて最適なエッジ検出アルゴリズムを選択する必要があります。最適なエッジ検出のための 3 つの主要な評価基準

  • 低いエラー率: ノイズによる誤検知を最小限に抑えながら、できるだけ多くの実際のエッジを識別します。
  • 正確なエッジの位置決め: マークされたエッジは、画像内の実際のエッジに可能な限り近くなければなりません。
  • 最小限の応答: 画像内のエッジは 1 回だけ識別されることが望ましく、画像の潜在的にノイズの多い部分はエッジとして識別されるべきではありません。

(2)キャニーオペレーター

Canny オペレーター: 1986 年に John Canny によって提案され、広く使用されているエッジ検出アルゴリズムです。低いエラー率と高い位置精度でエッジを検出でき、現在最も優れたエッジ検出アルゴリズムの 1 つと考えられています。アルゴリズムの手順は次のとおりです

  • ノイズ除去: まず、画像をガウス フィルター処理してノイズを除去する必要があります。
  • 勾配を計算する: 次に、Sobel オペレーターを使用して画像の勾配を計算し、エッジの強度と方向を検出します。
  • 非最大値抑制: 次に、勾配方向に非最大値抑制を実行して、小さなエッジ応答とエッジ幅を除去し、勾配方向の極大値を保持します。
  • 二重閾値処理: 次に、勾配値に従って二重閾値処理を実行し、ピクセルを強いエッジ、弱いエッジ、非エッジの 3 つのカテゴリに分類します。
  • エッジ接続: 最後に、強いエッジ ピクセルとそれに隣接する弱いエッジ ピクセルを接続することによって、完全なエッジを形成する必要があります。エッジを接続するプロセスでは、深さ優先検索または接続性分析に基づく方法を使用できます。

Canny オペレーターの利点は、優れたエッジ接続性、単一応答、および低いエラー率を備えていることです。欠点は計算量が大きいことです。さらに、Canny オペレータはパラメータの選択に非常に敏感であり、特定のアプリケーション シナリオに従って調整する必要があります。

(3) プログラム

ここに画像の説明を挿入


MATLAB の実装:

Image=im2double(rgb2gray(imread('lotus.jpg')));
figure,imshow(Image),title('原图像');
BW= edge(Image,'canny');
figure,imshow(BW),title('Canny边缘检测');

Python の実装:

Image=im2double(rgb2gray(imread('lotus.jpg')));
figure,imshow(Image),title('原图像');
BW= edge(Image,'canny');
figure,imshow(BW),title('Canny边缘检测');

おすすめ

転載: blog.csdn.net/qq_39183034/article/details/130510502