最初の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の技術情報はグループで交換できます〜