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

目录

图像阈值

[ret, dst = cv2.threshold(src, thresh, maxval, type)](#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) 
相关推荐
极创信息7 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
工业设备方案笔记14 小时前
RK3588工业视觉检测方案详解:AI如何赋能智能制造?
arm开发·人工智能·计算机视觉·目标跟踪·视觉检测·边缘计算·制造
欧特克_Glodon15 小时前
OpenCV计算机视觉开发入门与实践<七>:OpenCV 界面编程之窗口
c++·人工智能·opencv·计算机视觉
m0_6174939418 小时前
OpenCV cv2.circle() 坐标类型错误排查与修复指南
人工智能·opencv·计算机视觉
hans汉斯1 天前
《软件工程与应用》期刊推荐&10月版面征稿中
图像处理·人工智能·深度学习·算法·音视频·软件工程
pjj198541 天前
opencv-轮廓特征和轮廓近似
人工智能·opencv·计算机视觉
OH_TPC1 天前
HarmonyOS APP开发---“滤镜大师“图像处理App,需要用到这个库
java·图像处理·华为·harmonyos·鸿蒙
qq_25294131681 天前
列车车轮缺陷智能检测数据集:800张图像、4大类别,助力铁路安全运维
运维·人工智能·安全·yolo·目标检测·计算机视觉·视觉检测
老木避暑研究所1 天前
基于OpenCV的避暑房采光分析与朝向优化——重庆云澜栖不同楼层日照时长实测
人工智能·opencv·计算机视觉
leoZ2311 天前
Vue3 还原一个企业级后台-06-主布局设计
人工智能·opencv·机器学习·计算机视觉·数据挖掘·语音识别·caffe