目录
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会直接取255
box = 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)