[再版] OpenCV-Pythonシリーズの画像の腐食と膨張(20)

最初の2つのチュートリアルでは、画像に対するOpenCVのフィルタリングの概要を説明しました。通常、実際のプロジェクトでは、フィルタリング後の次のステップは画像の形態処理です。このチュートリアルから、OpenCV画像を正式に入力しました。形態学的処理の一部。

形態という用語は通常、主に植物や動物の形態や構造を研究する生物学の分野を指します。私たちの画像処理の形態は、数学的形態を指します。数学的形態学の概念を理解しましょう。

数理形態学は、格子理論とトポロジーに基づく画像解析の主題であり、数理形態学画像処理の基礎理論です。その基本的な操作には、バイナリ腐食と拡張、バイナリ開閉操作、スケルトン抽出、限界腐食、ヒットとミスの変換、形態勾配、トップハット変換、粒子分析、流域変換、グレー値腐食と拡張、グレイ値開閉操作、グレイ値形態勾配など

簡単に言えば、モルフォロジー演算は、形状に基づく一連の画像処理演算です。OpenCVは、画像の形態学的変換のための高速で便利な機能を提供します。基本的な形態学的操作には、膨張と収縮の2つがあります。

膨張と腐食は、主に次のようなさまざまな機能を実現します。

1ノイズを除去する

2独立した画像要素を分離し、画像内の隣接する要素を接続します。

3画像内の明らかな最大値領域または最小値領域を見つけます

4画像のグラデーションを見つける

腐食と膨張は白い部分(ハイライトされた部分)のためのものであり、黒い部分のためのものではありません。拡大は、画像のハイライトされた部分の拡大である「フィールド拡大」です。エフェクト画像には、元の画像よりも大きなハイライト領域があります。腐食とは、元の画像の強調表示された部分が腐食され、「領域が侵食される」ことを意味し、エフェクト画像の強調表示領域は元の画像よりも小さくなります。

うねり

実際、拡張は極大値を見つける操作です。

数学的に言えば、拡張または収縮操作は、カーネル(これをBと呼びます)を使用して画像(または画像の一部、Aと呼びます)をたたみ込むことです。

核は任意の形状とサイズにすることができ、アンカーポイントと呼ばれる個別に定義された参照ポイントがあります。ほとんどの場合、核は中央に基準点がある小さな正方形または円盤ですが、実際には核をテンプレートまたはマスクと見なすことができます。

拡大とは、極大値を求める操作です。カーネルBをグラフでたたみ込みます。つまり、カーネルBがカバーする領域のピクセルの最大値を計算し、参照点で指定されたピクセルに最大値を割り当てます。これにより、画像のハイライトされた領域が徐々に拡大します。次の図に示すように、これは拡張操作です。
ここに画像の説明を挿入

関数プロトタイプを見てみましょう:

cv2。膨張(img、kernel、iterations)-> dst

最初のパラメーター:imgは、拡張する必要がある画像を指します

2番目のパラメーター:カーネルは拡張操作のカーネルを参照します。デフォルトは単純な3X3マト​​リックスです。また、getStructuringElement()関数を使用してその形状を指定することもできます

3番目のパラメーター:反復は拡張の数を指し、省略はデフォルトです1

dstは返される画像です。

Numpyの関数は、畳み込みカーネルを定義するために必要です。長方形の畳み込みカーネル構造要素を定義できます。コードを見てみましょう:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
  
img = cv2.imread('01.jpg',0)  
kernel = np.ones((5,5),np.uint8)  
dict = cv2.dilate(img,kernel,iterations = 1)  
cv2.imshow("org",img)  
cv2.imshow("result", dict)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

5 * 5の長方形のたたみ込みカーネルを定義し、その効果は次のとおりです。
ここに画像の説明を挿入

実際、場合によっては、楕円形/円形のコアが必要になることがあります。したがって、この目的のために、OpenCVには関数cv.getStructuringElement()があります。必要なカーネル、関数プロトタイプを取得するには、カーネルの形状とサイズを渡すだけです:
retval = cv.getStructuringElement(shape、ksize [、anchor])

この関数の最初のパラメーターはカーネルの形状を表します。3つの形状から選択できます。

長方形:MORPH_RECT;

十字形:MORPH_CROSS;

楕円:MORPH_ELLIPSE;
ここに画像の説明を挿入

2番目と3番目のパラメーターは、カーネルのサイズとアンカーポイントの位置です。一般に、erode関数とdilate関数を呼び出す前に、変数を定義してそれを取得します。

getStructuringElement関数の戻り値:アンカーポイントの位置には、デフォルト値Point(-1、-1)があります。これは、アンカーポイントが中心点にあることを意味します。要素の形状はアンカーポイントの位置にのみ依存します。それ以外の場合、アンカーポイントは形態学的計算結果のオフセットにのみ影響します。

コードを見てみましょう:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
  
img = cv2.imread('01.jpg',0)  
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))  
dict = cv2.dilate(img,kernel,iterations = 1)  
cv2.imshow("org",img)  
cv2.imshow("result", dict)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

たたみ込みカーネルの形状については、ここでは楕円を選択しましたが、実験用に他の形状を選択することもできます。
ここに画像の説明を挿入

腐食

腐食をもう一度見てみましょう。膨張と腐食は1組の友であり、それらは反対の操作であるため、腐食は極小値を見つける操作です。私たちは一般的に腐食と膨張を理解し、それらから学びます。以下に示すように、2つの関数プロトタイプは基本的に同じです。
ここに画像の説明を挿入

関数プロトタイプを見てみましょう:

cv2.erode(img、kernel、iterations)-> dst

最初のパラメータ:imgは腐食する必要がある画像を参照します

2番目のパラメーター:kernelは腐食操作のカーネルを参照します。デフォルトは単純な3X3マト​​リックスです。getStructuringElement()関数を使用してその形状を指定することもできます

3番目のパラメーター:反復は腐食の回数を示し、省略はデフォルトで1です

dstは返される画像です。

コード:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
  
img = cv2.imread('01.jpg',0)  
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))  
erode = cv2.erode(img,kernel,iterations = 1)  
cv2.imshow("org",img)  
cv2.imshow("result", erode)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

効果:
ここに画像の説明を挿入
腐食と膨張は形態処理の基本操作であり、非常に重要な役割を果たします。また、その後の開閉操作の基礎となるため、巧みに使用する必要があります。

記事の概要ページを確認してくださいhttps://blog.csdn.net/weixin_44237705/article/details/107864965
openvinoの技術情報はグループで交換できます〜
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44237705/article/details/108315455