opencv图像平滑、膨胀操作、腐蚀操作及其衍生计算

发布于:2025-07-23 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

图像阈值

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) 


网站公告

今日签到

点亮在社区的每一天
去签到