目次
1. 形態
意味:
- 画像の形状特徴を処理する一連の画像処理技術を指します。
- 形態学の基本的な考え方は、特別な構造要素 (本質的にはコンボリューション カーネル) を使用して、入力画像内の対応する形状またはゼロ特徴を測定または抽出し、さらなる画像分析とターゲット認識を行うことです。
- これらの処理方法は基本的に 2 値画像、つまり白黒画像を処理します。
- コンボリューションカーネルは画像処理の効果を決定します
2. 画像のグローバル二値化
二値化: 画像の各ピクセルを 0,255 などの 2 つの値に変換します。
参考関数:
ケースコードは次のとおりです。
import cv2
import numpy as np
# 导入图片
img = cv2.imread('6.jpg')
# 二值化是对灰度图像操作
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 注意,threshold会返回两个值(一个是阈值,一个是二值化处理后的图片)
thresh,dst = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
# 展示
cv2.imshow('dog',np.hstack((gray,dst)))
# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 適応閾値二値化
前提:
前のパートでは、グローバルな匂いの値を使用し、画像全体で匂いの値と同じ数値を使用しました。この方法は、すべての状況、特に同じ画像の異なる部分の明るさが異なる場合に適しているわけではありません。この場合、適応聴覚値を使用する必要があります。このときのノイズ値は、画像上の各小領域とそれに対応するノイズ値に基づいて算出される。したがって、同じ画像上の異なる領域では異なる匂い値が使用されるため、明るさが異なる場合により良い結果が得られます。
ケースコードは次のとおりです。
import cv2
import numpy as np
img = cv2.imread('6.jpg')
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()
4. 腐食操作
腐食操作でもイメージをスキャンするためにコンボリューション カーネルを使用しますが、腐食操作のコンボリューション合計は通常 1 です。コンボリューション カーネル内のすべてのピクセルが白の場合、アンカー ポイントも白になります。
腐食操作 API:
ケースコードは次のとおりです。
import cv2
import numpy as np
# 导入图片
img = cv2.imread('6.jpg')
# 定义核
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.destroyWindow()
5. 形態学的コンボリューションカーネルの取得
OpenCv は、コンボリューション カーネルを取得するための API を提供します。これにより、コンボリューション カーネルを手動で作成する必要はありません。
ケースコードは次のとおりです。
import cv2
import numpy as np
img = cv2.imread('6.jpg')
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
# 腐蚀
dst = cv2.erode(img,kernel,iterations=2)
6. 拡張操作
ダイレーションはエロージョンの逆の操作で、コンボリューションカーネルのアンカーポイントがゼロ以外の値であれば、周囲の値が0であっても0以外であっても、0以外の値になるというのが基本原理です。
ケースコードは次のとおりです。
import cv2
import numpy as np
# 导入图片
img = cv2.imread('6.jpg')
# 动态获取卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))
# 膨胀操作
dst = cv2.dilate(img,kernel,iterations=1)
# 展示图片
cv2.imshow('img',np.hstack((img,dst)))
# 释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()
7. オープン操作
開放運転 = 腐食 + 膨張
ケースコードは次のとおりです。
import cv2
import numpy as np
# 开运算=腐蚀+膨胀
# 开运算提供了另一种去除噪声的思路
img = cv2.imread('6.jpg')
kernel = cv2.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()
実行結果は次のとおりです。
8. クローズドオペレーション
密閉動作 = 膨張 + 腐食
ケースコードは次のとおりです。
import cv2
import numpy as np
# 导入图片
img = cv2.imread('6.jpg')
# 卷积核
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()