opencv图像平滑、膨胀操作、腐蚀操作及其衍生计算
目录
图像阈值
ret, dst = cv2.threshold(src, thresh, maxval, type)
图像平滑
均值滤波
方框滤波
高斯滤波
中值滤波
拼接后显示全部效果图
腐蚀操作
膨胀操作
开运算与闭运算
开运算:先腐蚀,再膨胀
闭运算:先膨胀,再腐蚀
梯度运算
顶帽与黑帽
图像阈值
ret, dst = cv2.threshold(src, thresh, maxval, type)
src: 输入图,只能输入单通道图像,通常来说为灰度图
dst: 输出图
thresh: 阈值
maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
type: 二值化操作的类型,包含以下5种类型:
cv2.THRESH_BINARY;cv2.THRESH_BINARY_INV;cv2.THRESH_TRUNC;cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
cv2.THRESH_BINARY_INV THRESH_BINARY的反转
cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
cv2.THRESH_TOZERO INV THRESH_TOZERO的反转
img1 = cv2.imread(\"img1.jpg\",cv2.IMREAD_COLOR)img1_gray = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) # 转灰度图像ret, threshold = cv2.threshold(img1_gray,127,255,cv2.THRESH_BINARY) # 二值化cv2.imshow(\'threshold\',threshold)cv2.waitKey(0)cv2.destroyAllWindows()
各种操作类型对比:
cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
cv2.THRESH_BINARY_INV THRESH_BINARY的反转
cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
cv2.THRESH_TOZERO INV THRESH_TOZERO的反转
图像平滑
均值滤波
# 均值滤波# 简单的平均卷积操作blur = cv2.blur(img1,(3,3)) # (3,3)卷积核大小,通常为>1奇数
方框滤波
# 方框滤波 cv2.boxFilter(img,-1,(x,x),normalize)# \'-1\'表示处理后颜色通道数与处理前一致,一般不需要更改# (x,x)卷积核大小# normalize = True时,做归一化,此时方框滤波和均值滤波是一个东西# normalize = False时,不做归一化,此时rgb相加后数值可能>255越界,>255会直接取255box = cv2.boxFilter(img1,-1,(3,3),normalize=True)
高斯滤波
# 高斯滤波# 高斯模糊的卷积核里的数值是满足高斯分布(即正态分布)的,相当于越靠近卷积中心的越重视(权重更大)# cv2.GaussianBlur(img,(x,x),sigmaX,(sigmaY))# (x,x)高斯核大小# sigmaX 表示高斯核函数在X方向的的标准偏差。# sigmaY 表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX。aussian = cv2.GaussianBlur(img1,(5,5),1)
中值滤波
# 中值滤波# 相当于用中值代替# cv2.medianBlur(img,5) 5 表示5x5卷积核取中值代替原中心值median = cv2.medianBlur(img1,5)
拼接后显示全部效果图
# np.hstack((Aimg,Bimg,Cimg, ...)) 横向拼接# np.vstack((Aimg,Bimg,Cimg, ...)) 纵向拼接img3 = np.hstack((blur,box))img4 = np.hstack((aussian,median))cv2.imshow(\'img3\',img3)cv2.imshow(\'img4\',img4)cv2.waitKey(0)cv2.destroyAllWindows()
腐蚀操作
# 腐蚀操作# 若核覆盖的图像区域中存在0(背景),则中心像素被置0#(例如,核为3×3全1矩阵时,若覆盖区域中有任意一个像素为0,中心点即被腐蚀)。# 创建一个核# np.ones(x,x),np.uint8)# (x,x)核的大小# np.uint8 像素数值类型kernel = np.ones((5,5),np.uint8)# cv2.erode(img,kernel,iterations) 腐蚀操作# kernel 腐蚀操作核# iterations 迭代次数erosion = cv2.erode(img1,kernel,iterations = 1)cv2.imshow(\'erosion\',erosion)cv2.waitKey(0)cv2.destroyAllWindows()
处理前:
处理后:(迭代次数1次)
(迭代次数2次)
膨胀操作
# 膨胀操作# 若核覆盖的图像区域中存在1(背景),则中心像素被置1#(例如,核为3×3全1矩阵时,若覆盖区域中有任意一个像素为1,中心点即被膨胀)。# 创建一个核# np.ones(x,x),np.uint8)# (x,x)核的大小# np.uint8 像素数值类型kernel = np.ones((5,5),np.uint8)# cv2.dilate(img,kernel,iterations) 膨胀操作# kernel 膨胀操作核# iterations 迭代次数dilate = cv2.dilate(img1,kernel,iterations = 1)cv2.imshow(\'dilate\',dilate)cv2.waitKey(0)cv2.destroyAllWindows()
处理前:
处理后:(分别为迭代1次、迭代2次、迭代3次)
开运算与闭运算
开运算:先腐蚀,再膨胀
# 开运算:先腐蚀,再膨胀img1 = cv2.imread(\"img1.jpg\") # 一张黑白二值化后的图kernel = np.ones((5,5),np.uint8) # 核opening = cv2.morphologyEx(img1,cv2.MORPH_OPEN,kernel) # 开运算函数cv2.imshow(\'opening\',opening)cv2.waitKey(0)cv2.destroyAllWindows()
处理前:
处理后:
闭运算:先膨胀,再腐蚀
# 闭运算:先膨胀,再腐蚀img1 = cv2.imread(\"img1.jpg\") # 一张黑白二值化后的图kernel = np.ones((5,5),np.uint8) # 核closing = cv2.morphologyEx(img1,cv2.MORPH_CLOSE,kernel) # 闭运算函数cv2.imshow(\'closing\',closing)cv2.waitKey(0)cv2.destroyAllWindows()
梯度运算
梯度 = 膨胀 - 腐蚀(即左图白色部分减去右图白色部分)
# 梯度 = 膨胀 - 腐蚀img1 = cv2.imread(\"img1.jpg\") # 一张黑白二值化后的图kernel = np.ones((5,5),np.uint8) # 核dilate = cv2.dilate(img1,kernel,iterations = 5) # 膨胀erosion = cv2.erode(img1,kernel,iterations = 5) # 腐蚀res = np.hstack((dilate,erosion))cv2.imshow(\'res\',res) # 展示膨胀与腐蚀后的图cv2.waitKey(0)cv2.destroyAllWindows()
# 梯度运算# 梯度 = 膨胀 - 腐蚀img1 = cv2.imread(\"img1.jpg\") # 一张黑白二值化后的图kernel = np.ones((5,5),np.uint8) # 核gradient = cv2.morphologyEx(img1,cv2.MORPH_GRADIENT,kernel) # 梯度运算cv2.imshow(\'gradient\',gradient)cv2.waitKey(0)cv2.destroyAllWindows()
处理后:
顶帽与黑帽
顶帽 = 原始输入 - 开运算结果
tophat = cv2.morphologyEx(img1,cv2.MORPH_TOPHAT,kernel)
黑帽 = 闭运算结果 - 原始输入
blackhat = cv2.morphologyEx(img1,cv2.MORPH_BLACKHAT,kernel)