この章の学習目標:
画像の近傍と接続性の理解
さまざまな形態学的操作: 腐食、拡張、開閉操作、トップハットとブラックハットなど、およびさまざまな操作間の関係を理解します。
1.接続性
1.接続済み
画像の最小単位はピクセルであり、各ピクセルは隣接する 8 つのピクセルで囲まれており、一般的な隣接関係には 4 隣接、8 隣接、D 隣接の 3 つがあります。図に示すように:
4 つの近傍: ピクセル p(x,y) の 4 つの近傍は次のとおりです: (x+1,y); (x-1,y); (x,y+1); (x,y) -1)、ピクセル p を表す 4 隣接 D 隣接を使用: ピクセル p(x, y) の D 近傍は次のとおりです: 対角線上の点 (x+1, y+1; (x+1, y) -1 N4(p)
)ピクセル p の D ドメインを表すために使用されます。8 隣接: ピクセル p(x,y) の 8 近傍です。は: 4 近傍の点 +D 近傍の点は、ピクセル p の 8 近傍によって表されます。ND(p)
N8(P)
接続性は領域と境界を記述するための重要な概念です。2 つのピクセルの接続に必要な 2 つの条件は、
1. 2 つのピクセルの位置が隣接しているかどうか
、2. 2 つのピクセルのグレー値が特定の類似性基準を満たすかどうかです。 (または等しいかどうか)
接続性の定義によれば、4 Unicom、8 Unicom、m Unicom の 3 つのタイプがあります。
4-connected: 値 V を持つピクセル p および q の場合、q がセット内にある場合N4(p)
、2 つのピクセルは 4-connected と言われます。
8 連結。値 V を持つピクセル p および q について、q がセット内にある場合N8(P)
、これら 2 つのピクセルは 8 連結と言われます。
値 V を持つピクセル p および q について、次の場合:
1. q が set 内にあるN4(p)
、または
2. q が set 内にありND(p)
、 とN4(p)
のN4(q)
が空 (V 値のないピクセル) である
場合、これら 2 つのピクセルは m であると言われます。 -connected 、つまり 4-connected と D-connected の混合。
接続の具体的な用途はまだわかりません。後で検討します。非常に重要な場合は、概念をもう一度検討します。
2. 形態素操作
形態学的変換は、画像の形状に基づく単純な操作です。通常、バイナリ イメージに対して実行されます。エロージョンとダイレーションは 2 つの基本的な形態演算子です。そして、そのバリエーションには、オープン操作、クローズ操作、トップハット、ブラックハットなどが含まれます。
1. 腐食と膨張
侵食と拡張は最も基本的な形態学的操作であり、侵食と拡張は両方とも白い部分 (ハイライト部分) を対象とします。
膨張は画像内のハイライト領域を拡大することであり、エフェクト画像のハイライト領域は元の画像よりも大きくなります。
腐食は元の画像のハイライト領域に侵入し、エフェクト画像のハイライト領域は元の画像より小さくなります。画像。
拡張は、極大値を見つける操作です。
腐食は、極小値を見つける操作です。
(1) 腐食
具体的な操作は次のとおりです: 構造要素を使用して画像内の各ピクセルをスキャンし、構造要素内の各ピクセルとそれがカバーするピクセルで「AND」演算を実行します。両方が 1 の場合、ピクセルは 1、それ以外の場合は 1 になります。図に示すように、構造 A は構造 B によって腐食されます。
腐食の機能は、オブジェクトの境界点を除去し、ターゲットを小さくし、構造要素よりも小さいノイズ点を除去することです。
1)API
cv.erode(img,kernel,iterations)
パラメータ:
img: 処理する画像
kernel: カーネル構造
iterations: エロージョンの数、デフォルトは 1
(2) 拡張
具体的な操作は次のとおりです: 構造要素を使用して画像の各ピクセルをスキャンし、構造要素内の各ピクセルとそれがカバーするピクセルで「AND」演算を実行します。両方が 0 の場合、ピクセルは 0 であり、それ以外の場合は 0 です。 1. 以下の図に示すように、構造 A が構造 B によって拡張された後、
拡張の機能は、オブジェクトと接触するすべての背景点をオブジェクトにマージし、ターゲットを大きくし、ターゲットの穴を埋めることです。
1)API
cv.dilate(img,kernel,iterations)
パラメータ:
img: 処理する画像
kernel: カーネル構造
iterations: エロージョンの数、デフォルトは 1
(3) コード例
5*5 コンボリューション カーネルを使用して、侵食および拡張操作を実装します。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread("./image/image3.png")
# 2 创建核结构
kernel = np.ones((5, 5), np.uint8)
# 3 图像腐蚀和膨胀
erosion = cv.erode(img, kernel) # 腐蚀
dilate = cv.dilate(img,kernel) # 膨胀
# 4 图像展示
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(img)
axes[0].set_title("原图")
axes[1].imshow(erosion)
axes[1].set_title("腐蚀后结果")
axes[2].imshow(dilate)
axes[2].set_title("膨胀后结果")
plt.show()
2.開閉動作
開閉操作は、腐食と膨張を特定の順序で処理します。ただし、この 2 つは可逆的ではありません。つまり、最初に開いてから閉じると、元のイメージを取得することはできません。
(1) オープン動作
開口操作は、最初に腐食してから拡張するもので、その機能は物体を分離し、小さな領域を除去することです。
特徴: 元の画像に影響を与えることなく、ノイズを除去し、小さな干渉ブロックを除去します。
(2) 密閉運転
閉じる動作は開く動作の逆です。最初に膨張し、その後腐食します。その機能は、「閉じた」物体の穴をなくすことです。
特徴: 閉じた領域を埋めることができます。
(3)API
cv.morphologyEx(img, op, kernel)
パラメータ:
img: 処理対象の画像
op: 処理方法: オープン操作を行う場合は cv.MORPH_OPEN に設定、クローズ操作を行う場合は cv.MORPH_CLOSE を設定
カーネル: カーネル構造
(4) 例
10*10コア構造による開閉動作の実現
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img1 = cv.imread("./image/image5.png")
img2 = cv.imread("./image/image6.png")
# 2 创建核结构
kernel = np.ones((10, 10), np.uint8)
# 3 图像的开闭运算
cvOpen = cv.morphologyEx(img1,cv.MORPH_OPEN,kernel) # 开运算
cvClose = cv.morphologyEx(img2,cv.MORPH_CLOSE,kernel)# 闭运算
# 4 图像展示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img1)
axes[0,0].set_title("原图")
axes[0,1].imshow(cvOpen)
axes[0,1].set_title("开运算结果")
axes[1,0].imshow(img2)
axes[1,0].set_title("原图")
axes[1,1].imshow(cvClose)
axes[1,1].set_title("闭运算结果")
plt.show()
コード操作によって得られる効果図は次のとおりです。
3. シルクハットとブラックハット
(1) トップハット作戦
元の画像と「オープニング操作」の構造マップの差分は、次の式で計算されます。
オープニング操作の結果、亀裂や局所的な低輝度領域が拡大されるため、オープニング操作後の画像は、結果の画像では、元の画像の輪郭の周囲よりも明るい領域が強調表示されます。この操作は、選択したカーネル サイズに関連します。
トップハットの使用シナリオ
☆ トップハット操作は、隣のパッチより少し明るいパッチを分離するために使用されます。画像の背景が大きく、小さなアイテムが比較的規則的である場合、トップハット演算を背景の抽出に使用できます。
(2) ブラックハット作戦
「クローズド操作」の結果画像と元の画像の差分です。数式は次のとおりです。
ブラック ハット操作後のエフェクト画像は、元の画像の輪郭の周囲の領域よりも暗い領域を強調表示します。この操作は、選択したカーネルのサイズに関連しています。
ブラック ハット操作は、隣接するスポットよりも暗いパッチを分離するために使用されます。
(3)API
cv.morphologyEx(img, op, kernel)
パラメータ:
img: 処理対象の画像
op: 処理方法:
Kernel: カーネル構造
(4) コード例
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img1 = cv.imread("./image/image5.png")
img2 = cv.imread("./image/image6.png")
# 2 创建核结构
kernel = np.ones((10, 10), np.uint8)
# 3 图像的礼帽和黑帽运算
cvOpen = cv.morphologyEx(img1,cv.MORPH_TOPHAT,kernel) # 礼帽运算
cvClose = cv.morphologyEx(img2,cv.MORPH_BLACKHAT,kernel)# 黑帽运算
# 4 图像显示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img1)
axes[0,0].set_title("原图")
axes[0,1].imshow(cvOpen)
axes[0,1].set_title("礼帽运算结果")
axes[1,0].imshow(img2)
axes[1,0].set_title("原图")
axes[1,1].imshow(cvClose)
axes[1,1].set_title("黑帽运算结果")
plt.show()
取得したサンプル写真:
要約する
この章の学習内容を復習してください。