1. 形態
形態学とは、画像の形状特性を扱う一連の画像処理技術を指します。
- 形態学の基本的な考え方は、特別な構造要素 (本質的にはコンボリューション カーネル) を使用して、入力画像内の対応する形状または特徴を測定または抽出し、さらなる画像分析とターゲット認識を行うことです。
- これらの処理方法は基本的にバイナリ画像、つまり白黒画像を処理します。
- コンボリューションカーネルは画像処理の効果を決定します
形態学で一般的に使用される基本演算は次のとおりです。
- 膨張と腐食
- 開く操作
- 閉じる操作
- トップハット
- ブラックハット
1.1 画像のグローバル二値化
二値化: 画像の各ピクセルを 0、255 などの 2 つの値に変換します。
0 と 255: 0 は黒、255 は白
01: 0は黒、1は白
- 閾値(src, thresh, maxval, type[, dst])
- src はグレースケール画像であることが望ましい
- thresh: しきい値
- maxval: 最大値。最大値は必ずしも 255 である必要はありません。
- type: 操作タイプ 一般的な操作タイプは次のとおりです。
import cv2
import numpy as np
img = cv2.imread('./dog.jpeg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 返回两个结果, 一个是阈值, 另一个是处理后的图片
ret, dst = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY)
cv2.imshow('dog', np.hstack((gray, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 適応閾値二値化
前の部分では、イメージ全体のしきい値と同じ数値を使用して、グローバルしきい値を使用しました。この方法は、すべての状況、特に同じ画像の異なる部分の明るさが異なる場合に適しているわけではありません。この場合、適応しきい値を使用する必要があります。このときの閾値は、画像上の各小領域に基づいて対応する閾値を算出する。したがって、同じ画像の異なる領域では異なるしきい値が使用され、明るさが異なる場合でもより良い結果を得ることができます。
adaptiveThreshold(src, maxValue,adaptiveMethod,thresholdType,blockSize,C,dst=None)**
このメソッドでは、6 つのパラメーターを指定する必要があり、1 つの値のみを返します。
• **適応方法** - しきい値の計算に使用される方法を指定します。
– **cv2.ADPTIVE_THRESH_MEAN_C**: しきい値は隣接する領域の平均値から取得されます。
– **cv2.ADPTIVE_THRESH_GAUSSIAN_C**: しきい値は隣接する領域の加重合計から取得され、重みはガウス ウィンドウです。
• **ブロック サイズ** - 近傍サイズ (しきい値の計算に使用される領域のサイズ)。
• **C** - これは定数であり、しきい値は平均または加重平均からこの定数を引いたものと等しくなります。
# 因为光线问题, 全局二值化导致有部分地方看不见了.这时就需要自适应阈值二值化了.
import cv2
import numpy as np
img = cv2.imread('./math.png')
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 1920, 1080)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 自适应阈值二值化只返回一个值, 即二值化后的结果
dst = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)
cv2.imshow('img', np.hstack((gray, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
1.3 腐食操作
腐食操作でもイメージをスキャンするためにコンボリューション カーネルを使用しますが、腐食操作のコンボリューションカーネルは通常 1 です。コンボリューション カーネル内のすべてのピクセルが白の場合、アンカー ポイントは白になります。
- ほとんどの場合、腐食操作ではすべて 1 のコンボリューション カーネルが使用されます。
- erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
- iterations は腐食操作の反復回数です。数値が大きいほど、腐食操作が実行される回数が多くなり、腐食の影響がより明白になります。
import cv2
import numpy as np
img = cv2.imread('./msb.png')
kernel = np.ones((3, 3), np.uint8)
dst = cv2.erode(img, kernel, iterations=2)
cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
1.4 形態学的コンボリューションカーネルの取得
- opencv は、畳み込みカーネルを取得するための API を提供します。畳み込みカーネルを手動で作成する必要はありません。
- Shape はコンボリューション カーネルの形状を指します。長さと幅を指すのではなく、コンボリューション カーネルの 1 によって形成される形状を指すことに注意してください。 - MORPH_RECT コンボリューション カーネルの 1 は長方形です
。
・MORPH_ELLIPSE楕円
・MORPH_CROSS十字
import cv2
import numpy as np
img = cv2.imread('./j.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.erode(img, kernel, iterations=2)
cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
1.5 拡張操作
膨張は侵食の逆の操作であり、基本原理は、コンボリューション カーネルのアンカー ポイントが非ゼロ値であることが保証されている限り、周囲の値は 0 であっても非ゼロ値になるというものです。ゼロ以外の値。
- dilate(img、カーネル、反復=1)
import cv2
import numpy as np
img = cv2.imread('./j.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.dilate(img, kernel, iterations=2)
cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
1.6 オープン操作
開く操作と閉じる操作はどちらも、侵食と拡張の基本的なアプリケーションです。
- オープン操作 = 侵食 + 拡張
- morphologyEx(img, MORPH_OPEN, kernel)
- MORPH_OPEN は形態学的オープニング操作を表します
- カーネル ノイズ ポイントが多ければ大きいカーネルが選択され、ノイズ ポイントが小さければ小さいカーネルが選択されます。
import cv2
import numpy as np
img = cv2.imread('./dotj.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# 腐蚀
# dst = cv2.erode(img, kernel, iterations=2)
# # 膨胀
# dst = cv2.dilate(dst, kernel, iterations=2)
# 直接调用opencv提供的开运算api
dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=2)
cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
1.7 クローズドオペレーション
- 密閉操作 = 膨張 + 腐食
import cv2
import numpy as np
img = cv2.imread('./dotinj.png')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=2)
cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
1.8 形態学的勾配
- グラデーション = 元の画像 - 腐食
- 腐食後、元の画像のエッジが小さくなります 元の画像 - 腐食により、腐食された部分、つまりエッジが得られます。
import cv2
import numpy as np
img = cv2.imread('./j.png')
# 注意调节kernel大小以获得更清晰的边缘
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, iterations=1)
cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
1.9 トップハット演算
- トップハット = 元の画像 - オープン操作
- オープン操作の効果は、画像の外側のノイズを除去することです 元の画像 - オープン操作では、除去されたノイズが得られます。
import cv2
import numpy as np
img = cv2.imread('./tophat.png')
# 注意调整kernel以保留小图形
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19, 19))
dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, iterations=1)
cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
1.10 ブラックハットオペレーション
- ブラックハット = 元の画像 - クローズド操作
- クローズド操作によりグラフィック内のノイズを除去できます。その後、元の画像 - クローズド操作の結果がグラフィック内のノイズになります。
import cv2
import numpy as np
img = cv2.imread('./dotinj.png')
# 注意调节kernel大小以获得更清晰的边缘
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=1)
cv2.imshow('img', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()