OpenCV图像预处理2

目录

图像平滑处理

高斯滤波

双边滤波

中值滤波

图像边缘检测

Canny边缘检测

图像形态学操作

腐蚀

膨胀

开运算

闭运算

顶帽

黑帽

形态学梯度


图像平滑处理

高斯滤波

高斯滤波的原理是利用高斯函数对图像进行加权平均。在滤波过程中,每个像素的值都会被其周围像素的加权平均值所取代,而这些权重则由高斯分布函数计算得出。通过这种方式,高斯滤波可以有效地减少图像中的噪声,并保留图像的整体特征。

cv2.GaussianBlur() 是 OpenCV 库中用于图像模糊处理的函数之一。该函数可以对图像进行高斯模糊处理,即在每个像素周围使用高斯核来加权平均计算像素值,从而达到模糊效果。

cv2.GaussianBlur(src, ksize, sigmaX)

 参数:

  • src:输入图像。

  • ksize:高斯核的大小,通常以元组 (width, height) 的形式指定。

  • sigmaX:高斯核在 x 方向上的标准差。

img = cv2.imread('pic/renwu02.png')
# 高斯核,必须是奇数
ksize = (7, 7)
# 标准差
sigmaX = 4
# 高斯过滤操作
gs_img = cv2.GaussianBlur(img, ksize, sigmaX )

cv2.imshow('orignal_img',img)
cv2.imshow("gs_img",gs_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

双边滤波

双边滤波是图像处理中常用的一种平滑滤波方法,它可以同时平滑图像并保留边缘信息。

cv2.bilateralFilter() 是 OpenCV 库中用于图像滤波处理的函数之一。该函数可以对图像进行双边滤波处理,即在保持边缘清晰的同时,对图像进行平滑处理。

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)

 参数:

  • src:输入图像。

  • d:滤波器的直径,用于指定在每个像素周围考虑的像素邻域大小。一般为正奇数

  • sigmaColor:颜色空间的标准差,用于控制滤波过程中颜色相似性的权重。较大的值意味着更宽松的颜色相似性条件

  • sigmaSpace:坐标空间的标准差,用于控制滤波过程中空间相似性的权重。较大的值意味着更宽松的空间相似性条件。

img = cv2.imread('pic/renwu02.png')

# 图像速点直径
d = 28
# 颜色权重
sigmaColor = 50
# 空间权重
sigmaSpace = 60

# 双边滤波
b_img = cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)

cv2.imshow('orignal_img', img)
cv2.imshow("b_img", b_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

中值滤波

中值滤波是图像处理中常用的一种平滑滤波方法,其主要作用是去除图像中的胡椒噪声或其他类型的脉冲噪声。

cv2.medianBlur()是OpenCV中的一个函数,用于对图像进行中值滤波处理。中值滤波是一种常见的图像处理技术,可用于去除图像中的椒盐噪声或斑点噪声。这个函数的语法如下:

 cv2.medianBlur(src, ksize)

其中:

  • src 是输入的图像。

  • ksize 是用于中值滤波的孔径大小,必须是大于1的奇数,例如3、5、7等。

img = cv2.imread('pic/hujiao.png')

# 滤波孔径
ksize = 5

median_img = cv2.medianBlur(img, ksize)

cv2.imshow('orignal_img', img)
cv2.imshow("median_img", median_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像边缘检测

Canny边缘检测

Canny 边缘检测广泛应用于图像处理、计算机视觉和机器学习中的物体识别、图像分割等任务。

edges = cv2.Canny(image, threshold1, threshold2)

参数

  • image: 输入的灰度图像。

  • threshold1: 第一个阈值,用于边缘检测的低阈值。如果一个像素的梯度值大于低阈值,那么这个像素可能会被认为是边缘的一部分。

  • threshold2: 第二个阈值,用于边缘检测的高阈值。如果一个像素的梯度值大于高阈值,那么这个像素几乎可以肯定是边缘的一部分。

返回值

  • edges: 返回检测到的边缘图像,边缘部分为白色,其他部分为黑色。

img = cv2.imread('pic/wenzi.jpeg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 阈值
lower = 278
upper = 280


# Canny边缘检测
canny_img = cv2.Canny(gray_img, lower, upper)

cv2.imshow("canny_img", canny_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

图像形态学操作

在OpenCV中,形态学操作是一类基于形状的图像处理技术,主要用于提取图像中的有用特征,如边界检测、噪声去除等。

腐蚀

腐蚀操作会减少图像中白色区域的大小,常用于消除小的白色噪声点

 cv2.erode(src, kernel, dst,iterations=1)

参数:

  • src: 输入图像。

  • kernel: 结构元素,用于定义腐蚀操作的方式。是一个矩阵结构数据

  • dst (可选): 输出图像。如果未提供,则会自动创建一个新的图像。

  • iterations (可选): 腐蚀操作的迭代次数,默认为1

迭代次数的影响

  • 迭代次数iterations 参数控制腐蚀操作的迭代次数。增加迭代次数会使腐蚀效果更加明显,但也会导致前景物体变得更小

img = cv2.imread('pic/ceshi02.jpg')

# 卷积核
kernel = np.ones((3,3), np.uint8)
# 迭代次数
num =3

# 腐蚀操作
eroded_img = cv2.erode(img, kernel, iterations=num)

cv2.imshow('orignal_img', img)
cv2.imshow("eroded_img", eroded_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

膨胀

膨胀操作与腐蚀相反,它会增加图像中白色区域的大小,常用于填补前景物体中的小洞或扩大前景物体的边界。

 cv2.dilate(src, kernel, iterations=1)

参数:

  • src: 输入图像。

  • kernel: 结构元素,用于定义腐蚀操作的方式。是一个矩阵结构数据

  • dst (可选): 输出图像。如果未提供,则会自动创建一个新的图像。

  • iterations (可选): 迭代操作的迭代次数,默认为1

img = cv2.imread('pic/ceshi01.jpeg')

# 卷积核
kernel = np.ones((9, 9), np.uint8)
# 迭代次数
num = 5

# 膨胀操作
dilate_img = cv2.dilate(img, kernel, iterations=num)

cv2.imshow('orignal_img', img)
cv2.imshow("dilate_img", dilate_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

开运算

开运算是先腐蚀后膨胀的过程,常用于去除小的物体、平滑较大的物体边界以及填充细长的突出部分。

cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

参数:

  • src: 输入图像。

  • op: 形态学操作的类型,可以是以下几种之一:

    • cv2.MORPH_OPEN:开运算

    • cv2.MORPH_CLOSE:闭运算

    • cv2.MORPH_GRADIENT:形态学梯度

    • cv2.MORPH_TOPHAT:顶帽

    • cv2.MORPH_BLACKHAT:黑帽

  • kernel: 结构元素,用于定义形态学操作的方式。可以通过 cv2.getStructuringElement 函数获得

img = cv2.imread('pic/ceshi02.jpg')

# 定义结构元素
k = np.ones((5, 5), np.uint8)
# 迭代次数
i = 2

# 开运算
result_img = cv2.morphologyEx(img, cv2.MORPH_OPEN,kernel=k,iterations=i)

cv2.imshow('orignal_img', img)
cv2.imshow("result_img", result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

闭运算

闭运算是先膨胀后腐蚀的过程,常用于填充前景物体中的小洞,平滑较大物体的边界以及连接邻近的物体。

cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

img = cv2.imread('pic/ceshi01.jpeg')

# 定义结构元素
k = np.ones((3, 3), np.uint8)
# 迭代次数
i = 10

# 闭运算
result_img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel=k, iterations=i)

cv2.imshow('orignal_img', img)
cv2.imshow("result_img", result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

顶帽

顶帽变换是原图像与开运算结果的差值,用于获取图像中的亮细节。

顶帽: 原图减去开运算,得到大图形外的小图形

 cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

img = cv2.imread('pic/ceshi02.jpg')

# 定义结构元素
k = np.ones((5, 5), np.uint8)
# 迭代次数
i = 1

# 顶帽
result_img = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel=k, iterations=i)

cv2.imshow('orignal_img', img)
cv2.imshow("result_img", result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

黑帽

黑帽变换是闭运算结果与原图像的差值,用于获取图像中的暗细节。

黑帽:原图减去闭运算,得到大图形内的小图形

cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

img = cv2.imread('pic/ceshi01.jpeg')

# 定义结构元素
k = np.ones((11, 11), np.uint8)
# 迭代次数
i = 1

# 黑帽
result_img = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel=k, iterations=i)

cv2.imshow('orignal_img', img)
cv2.imshow("result_img", result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

形态学梯度

形态学梯度是通过计算膨胀后的图像与腐蚀后的图像之间的差值来得到的,可以突出物体的边缘

形态学梯度= 原图-腐蚀的图

 cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)

img = cv2.imread('pic/xtx.gif')

# 定义结构元素
k = np.ones((5, 5), np.uint8)
# 迭代次数
i = 1

# 形态学梯度
result_img = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel=k, iterations=i)

cv2.imshow('orignal_img', img)
cv2.imshow("result_img", result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值