二值化
将图像的每个像素变成2种值,如0,255
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)# THRESH_BINARY_INV 取反
ret, dst = cv2.threshold(cat_gray, 100, 255, cv2.THRESH_BINARY)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_gray)
cv2.imshow('dst', dst)cv2.waitKey(0)
thresholdType
自适应阈值二值化
由于光照不均匀以及阴影的存在,只有一个阈值会使得在阴影处的白色被二值化为黑色。
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)dst = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_gray)
cv2.imshow('dst', dst)cv2.waitKey(0)
腐蚀 erode
一般使用全1卷积核
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)kernel = np.ones((3, 3), np.uint8)
dst = cv2.erode(cat_binary, kernel, iterations=1)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)
获得形态学卷积核 getStructuringElement
- MORPH_RECT
- MORPH_ELLIPSE
- MORPH_CROSS
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (7, 7))
print(kernel)
dst = cv2.erode(cat_binary, kernel, iterations=1)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)
膨胀 dilate
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)kernel = np.ones((3, 3), np.uint8)
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (7, 7))
print(kernel)
dst = cv2.dilate(cat_binary, kernel, iterations=1)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)
开运算 = 腐蚀 + 膨胀
消除噪点
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)dst = cv2.morphologyEx(cat_binary, cv2.MORPH_OPEN, kernel)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)
闭运算 = 膨胀 + 腐蚀
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)dst = cv2.morphologyEx(cat_binary, cv2.MORPH_CLOSE, kernel)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)
形态学梯度 = 原图 - 腐蚀
计算边缘
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)dst = cv2.morphologyEx(cat_binary, cv2.MORPH_GRADIENT, kernel)cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)
顶帽运算 = 原图 - 开运算
只保留大块外小噪点
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)dst = cv2.morphologyEx(cat_binary, cv2.MORPH_TOPHAT, kernel)cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)
黑帽运算 = 原图 - 闭运算
保留大块中的小噪点
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)dst = cv2.morphologyEx(cat_binary, cv2.MORPH_BLACKHAT, kernel)cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)