Python画像処理丨画像腐食と画像拡張

要約: この記事では主に、OpenCVを呼び出して画像の侵食と画像の拡張を実装するPythonのアルゴリズムについて説明します。

この記事は、HuaweiCloudCommunity「[PythonImageProcessing] 8. Image Corrosion and Image Expansion」、作成者:eastmountから共有されています。

この記事では、主にPythonがOpenCVを呼び出して画像の侵食と画像の拡張を実装するアルゴリズムについて説明します。基本的な知識がお役に立てば幸いです。

  • 1.基礎理論
  • 2.画像​​侵食コードの実装
  • 3.画像インフレコードの実装

1.基礎知識

(注:この部分は、著者の論文「改良されたSobel演算子と地域選択のあるIDカードのインテリジェントな識別方法」を参照しています)

画像の拡張と侵食は2つの基本的な形態学的操作であり、主に画像内の非常に大きい領域と非常に小さい領域を見つけるために使用されます。拡大は「フィールド拡大」に似ており、画像の強調表示された領域または白い部分を拡大し、結果の画像は元の画像の強調表示された領域よりも大きくなります。侵食は「フィールドが侵食された」に似ています。画像内の高レベルの画像が拡大されます。明るい領域または白い部分が縮小されて洗練され、操作の結果の画像は元の画像の強調表示された領域よりも小さくなります。

1.画像の膨張

展開演算子は「⊕」であり、次のように定義されます。

この式は、Bが画像Aを拡張するために使用されることを示しています。ここで、Bは畳み込みテンプレートまたは畳み込みカーネルであり、その形状は正方形または円です。テンプレートBは画像Aと畳み込まれ、スキャンされた画像の各画像は畳み込みによって計算されます。ピクセルの場合、テンプレート要素とバイナリイメージ要素を使用して「AND」操作を実行します。両方が0の場合、ターゲットピクセルは0です。それ以外の場合は、1です。これにより、Bのカバレッジエリア内のピクセルポイントの最大値が計算され、参照ポイントのピクセル値がこの値に置き換えられて拡張が実現されます。次の図は、左側の元の画像Aの効果画像A⊕Bを右側に拡大したものです。

処理結果を次の図に示します。

2.画像​​の侵食

腐食の演算子は「-」で、次のように定義されます。

この式は、画像Aが畳み込みテンプレートBによって侵食され、テンプレートBと画像Aの畳み込み計算が実行されて、Bがカバーする領域のピクセルの最小値が取得され、この最小値がピクセル値の代わりに使用されることを示しています。基準点の。図に示すように、左側の元の画像Aは、右側の効果画像ABに侵食されています。

処理結果を次の図に示します。

2.画像​​腐食コードの実装

1.基礎理論

形態学的変換は、主にバイナリイメージ(0または1)を対象としています。画像の侵食は「侵食されている領域」に似ており、画像の強調表示された領域または白い部分を縮小および縮小し、結果の画像は元の画像の強調表示された領域よりも小さくなります。これには主に2つの入力オブジェクトが含まれます。

(1)バイナリイメージ
(2)畳み込みカーネル

畳み込みカーネルは腐食の重要な配列であり、numpyライブラリを使用して生成できます。次の図に示すように、畳み込みカーネルの中心点は、元の画像をピクセルごとにスキャンします。

スキャンされた元の画像のピクセルの場合、畳み込みカーネルに対応する要素値が1の場合にのみ、その値は1になります。それ以外の場合、その値は0に変更されます。つまり、トラバースした黄色のポイント位置は、周囲全体が白で、白のままです。そうでない場合は黒になり、画像の侵食が小さくなります。

2.関数プロトタイプ

画像侵食で使用される主な機能は侵食であり、そのプロトタイプは次のとおりです。

dst = cv2.erode(src、kernel、iterations)

パラメータdstは処理の結果を表し、srcは元の画像を表し、kernelは畳み込みカーネルを表し、iterationsは反復回数を表します。次の図は、関数np.ones((5,5)、np.uint8)を使用して構築できる5*5畳み込みカーネルを示しています。

注:デフォルトの反復回数は1です。これは、1回の腐食を実行するか、必要に応じて複数の反復を実行して複数の腐食を実行できることを意味します。

3.コードの実装

完全なコードは次のようになります。

#encoding:utf-8
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('test01.jpg', cv2.IMREAD_UNCHANGED)

#设置卷积核
kernel = np.ones((5,5), np.uint8)

#图像腐蚀处理
erosion = cv2.erode(src, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

出力結果を次の図に示します。

図から、干渉する細い線はきれいになっていることがわかりますが、まだ輪郭が残っています。このとき、繰り返し回数を侵食するように設定できます。

侵食=cv2.erode(src、kernel、iterations = 9)

出力結果を次の図に示します。

3.画像インフレコードの実装

1.基礎理論

画像の拡大は、画像の強調表示された領域または白い部分を拡大する「フィールド拡大」と同様に、侵食操作の逆の操作です。結果の画像は、元の画像の強調表示された領域よりも大きくなり、線は次のようになります。より厚い。ノイズ除去用。

(1)画像が侵食された後、ノイズは除去されますが、画像は圧縮されます。
(2)腐食した画像に膨張処理を施し、ノイズを除去して元の形状を維持します。

また、2つの入力オブジェクトが含まれています。

(1)バイナリイメージまたは元のイメージ
(2)畳み込みカーネル

畳み込みカーネルは腐食の重要な配列であり、numpyライブラリを使用して生成できます。次の図に示すように、畳み込みカーネルの中心点は、元の画像をピクセルごとにスキャンします。

スキャンされた元の画像のピクセルの場合、畳み込みカーネルに対応する要素値の1つだけが1の場合、その値は1であり、それ以外の場合は0です。

2.関数プロトタイプ

画像拡張に使用される主な機能は拡張であり、そのプロトタイプは次のとおりです。

dst = cv2.dilate(src、kernel、iterations)

パラメータdstは処理の結果を表し、srcは元の画像を表し、kernelは畳み込みカーネルを表し、iterationsは反復回数を表します。次の図は、関数np.ones((5,5)、np.uint8)を使用して構築できる5*5畳み込みカーネルを示しています。

注:デフォルトの反復回数は1です。これは、1回の拡張を実行するか、必要に応じて複数の反復を実行して複数の拡張を実行できることを意味します。通常、1回の拡張で十分です。

3.コードの実装

完全なコードは次のようになります。

#encoding:utf-8
import cv2  
import numpy as np  

#读取图片
src = cv2.imread('test02.png', cv2.IMREAD_UNCHANGED)

#设置卷积核
kernel = np.ones((5,5), np.uint8)

#图像膨胀处理
erosion = cv2.dilate(src, kernel)

#显示图像
cv2.imshow("src", src)
cv2.imshow("result", erosion)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

出力は次のとおりです。

画像のノイズ除去は通常、侵食してから拡大する必要があります。これは、オープニング操作とも呼ばれます。これについては、次の記事で詳しく説明します。以下に示すように:

erosion = cv2.erode(src、kernel)
result = cv2.dilate(erosion、kernel)

この記事は、eastmount XHUAWEICLOUD開発者コミュニティが共同で作成した電子書籍「FromZerotoOne•PythonImageProcessingandRecognition」から抜粋したものです。

無料の電子書籍「ゼロからワンへ•Python画像処理と認識」をダウンロードするにはクリックしてください

 

[フォロー]をクリックして、HUAWEI CLOUDの新技術について初めて学びましょう〜

{{o.name}}
{{m.name}}

おすすめ

転載: my.oschina.net/u/4526289/blog/5553359