OpenCV (5): 画像の侵食と拡張、畳み込みの概念

 画像の腐食:

画像侵食の機能はバリを除去することであり、これは通常バイナリ画像に使用されます。

バイナリ イメージがあるとします。

現在、上の画像に対して侵食操作を実行して、テキストの周囲のバリを除去しています。 

OpenCV での画像侵食に使用されるメソッドは cv2.erode(入力画像、コンボリューション カーネル、反復数) です。

import cv2
import numpy as np

#读取图像
img = cv2.imread('Hello.png')

#写一个展示图像的方法
def cv_show(title,img):
    cv2.imshow(title,img)
    cv2.waitKey(0) 
    cv2.destroyAllWindows()
    return

# cv_show('img',img)

kernel = np.ones((3,3),dtype = np.uint8)#定义卷积核
erode = cv2.erode(img,kernel,iterations = 2)#调用腐蚀方法,迭代两次

cv_show('erode',erode)#展示腐蚀后的图像

 返される結果は次のとおりです。

 画像侵食の原理は、コンボリューション カーネル (前の記事で説明したフィルター カーネルと同じもの) を使用して、グラフィックス マトリクス内のピクセルごとに決定することです。

畳み込みカーネルが 3*3 行列であると仮定します。畳み込みカーネルに隣接するピクセル内のすべてのピクセルが白または黒であれば、この点は問題ありません。点が 3*3 ピクセルに隣接している場合、白と黒が存在します。黒の場合、ポイントが腐食します。

この方法の結果は、バイナリ イメージ (イメージ マトリックスに 2 つの値のみを持つイメージ) の場合、境界線の近傍のピクセルのみに 2 つの値が含まれるため、境界線が腐食されます。iteration パラメータは反復回数を表し、1 回の反復で画像の境界を 1 回腐食します。コンボリューション カーネルのサイズも侵食に影響します。コンボリューション カーネルが大きいほど、1 回の反復後の侵食境界は深くなります。

詳細については、以下の図を参照してください。

 画像の肥大化

画像縮小とは対照的に、画像拡張はバイナリ画像を拡大するために使用される機能です。
画像の拡張には、opencv の cv2.dilate() メソッドが使用されます。パラメーターは、入力画像、コンボリューション カーネル、および反復回数であるエロージョンと一致しており、
画像の拡張は本質的にエロージョンによって実行される操作と同様です。侵食は画像の境界線を黒くすること、拡大は白を与えることです。

import cv2
import numpy as np

#读取图像
img = cv2.imread('Hello.png')

#展示图像的方法
def cv_show(title,img):
    cv2.imshow(title,img)
    cv2.waitKey(0) 
    cv2.destroyAllWindows()
    return

#定义卷积核
kernel = np.ones((3,3),dtype = np.uint8)
#图像膨胀
dilate = cv2.dilate(img, kernel, iterations = 2)
cv_show('dilate',dilate)

返される結果:

 画像のエッジが拡大されていることがわかり、画像の特徴が拡大されているとも言えます。

画像拡大の原理は画像浸食とほぼ同じですが、最終的な割り当てが異なります。腐食は黒を割り当て、拡大は白を割り当てます。もちろん、必ずしも白と黒である必要はありません。2 つの値がどちらであるかによって決まります。バイナリ イメージは、0 と 255 が白と黒に対応します。

画像の畳み込み:

次に、前章のフィルタリングの学習と、この章のオープン演算とクローズ演算の学習を通じて、誰もが畳み込みとは何かについてある程度の理解を得るはずです。

理解を助けるために、下の図を使用してください。画像の本質はマトリックスであり、1 次元マトリックス (グレースケール画像)、3 次元マトリックス (RGB 画像、パンクロマティック画像)、およびマルチスペクトル画像 (多次元) があります。畳み込みは、画像行列自体に対する畳み込みカーネル演算を通じて新しい行列を計算することです。コンボリューション カーネルは、下の図の赤いボックスです。赤いボックス内の要素は一連の計算を通じて新しい値を取得し (アルゴリズムが異なれば計算方法も異なります)、その後 1 つのステップ サイズに従って計算することで新しい行列を取得でき、この行列が新しい行列になります。必要な画像。

オープン操作:

バリの除去に加えて、画像自体の侵食により、元の画像の一部の特徴も削除されます。つまり、必要な画像のエッジも侵食されます。下の写真は侵食前と侵食後の比較ですが、バリは除去されていますが、「Hello World」自体も薄くなっていることがわかります。

この問題を解決する方法は、まず画像を腐食し、バリを除去し、次に画像拡張を使用して画像の腐食した特徴を拡大することです。

上記のコード:

import cv2
import numpy as np

img = cv2.imread('Hello.png')
#显示图图像的方法
def cv_show(title,img):
    cv2.imshow(title,img)
    cv2.waitKey(0) 
    cv2.destroyAllWindows()
    return
#开运算:先侵蚀再膨胀
def clean(img):
    kernel = np.ones((3,3),dtype = np.uint8)
    erode = cv2.erode(img,kernel,iterations = 2 )#图像腐蚀
    dilate = cv2.dilate(erode, kernel, iterations = 2)#图像膨胀
    return dilate

#调用开运算
dilate = clean(img)

#展示图片
cv_show('dilate',dilate)

戻る:

 前回の画像侵食操作と比較すると、侵食された画像のエッジは復元されていますが、除去されたバリは戻っていないことがわかります。

その後、関連するコードは OpenCV 自体にカプセル化されており、開く操作メソッドを自分で定義する必要はありません。

OpenCV のメソッドは cv2.morphologyEx(src, op, kernel) で、src は画像を渡し、op はグラフィックス操作メソッド、およびカーネル畳み込みカーネルを指します。

その中で最も重要なのは op パラメータです。op = cv2.MORPH_OPEN は操作を開始することを意味します。

import cv2
import numpy as np

def cv_show(title,img):
    cv2.imshow(title,img)
    cv2.waitKey(0) 
    cv2.destroyAllWindows()
    return

img = cv2.imread('Hello.png')
kernel = np.ones((5,5),dtype = np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN,kernel)#开运算

cv_show('open',opening)

閉じる操作

閉じる動作の原理は開く動作の原理と逆で、最初に膨張し、次に腐食します。

閉じる操作は主に画像内の小さな穴に対して行われます。開封操作によりバリは除去されますが、画像の穴は解消できません。穴を縮小してから拡大しても意味がないので、拡大してから穴を塞ぎ、その後縮小して元の形状に戻す必要があります。

下の写真のようになります。最初に腐食してから拡張すると、穴(画像の黒い点)が拡大してから縮小するだけですが、最初に拡張して穴を削除し、次に腐食して、拡張後に画像の端を腐食すると、穴を削除することができます。これは閉じる操作です。

 クローズド操作でも cv2.morphologyEx(src, op, kernel) メソッドが使用されますが、この時点では op=cv2.MORPH_CLOSE である点が異なります。

上記のコード:

import cv2
import numpy as np

def cv_show(title,img):
    cv2.imshow(title,img)
    cv2.waitKey(0) 
    cv2.destroyAllWindows()
    return

img = cv2.imread('dongdong.png')
kernel = np.ones((5,5),dtype = np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_CLOSE,kernel)#闭运算

cv_show('open',opening)

戻る

 穴が削除され、楕円自体のサイズが変わっていないことがわかります。

おすすめ

転載: blog.csdn.net/m0_50317149/article/details/129768790