您现在的位置是:首页 >学无止境 >【Python_Opencv图像处理框架】图像阈值与滤波网站首页学无止境

【Python_Opencv图像处理框架】图像阈值与滤波

畅游星辰大海 2023-05-31 08:00:02
简介【Python_Opencv图像处理框架】图像阈值与滤波

写在前面

本篇文章是opencv学习的第二篇文章,主要讲解了图像的阈值和滤波操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正❤️


写在中间

一、 图像阈值

( 1 )简单介绍

图像阈值是数字图像处理中常用的一种方法,通过指定一个阈值(Threshold),将图像中的像素分为两类:大于阈值的像素设置为一种颜色,小于阈值的像素设置为另一种颜色。这样可以将一些噪声或者无用的信息分离出来,帮助进一步处理图像。

( 2 )操作实现

ret, dst = cv2.threshold(src, thresh, maxval, type)

解释

 src:输入图,仅单通道灰度图;thresh阈值;maxval最大值;type阈值类型。

阈值类型

  • cv2.THRESH_BINARY:二值化操作,像素值大于阈值的点用maxval最大值表示,小于阈值用0表示。

  • cv2.THRESH_BINARY_INV:表示阈值的二值化翻转操作,大于阈值的使用0表示,小于阈值的使用最大值表示。

  • cv2.THRESH_TRUNC:截断操作,大于阈值的使用阈值表示,小于阈值的不变。

  • cv2.THRESH_TOZERO:化零操作,大于阈值的不变,小于阈值的使用0表示

  • **cv2.THRESH_TOZERO_INV:**化零操作的翻转,大于阈值的使用0表示,小于阈值的不变

( 3 )代码示例

img = cv2.imread("自行右键复制图片路径", 0) # 以灰度模式读入图像

ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 二值化操作,像素值大于127的点用225表示,小于阈值使用0表示
ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)  # 大于阈值的使用0表示,小于阈值的使用最大值表示
ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)  # 截断操作,大于阈值的使用阈值表示,小于阈值的不变。
ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)  # 化零操作,大于阈值的不变,小于阈值的使用0表示
ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)  # 化零操作的翻转,大于阈值的使用0表示,小于阈值的不变

titles = ['img', 'Binary', 'Binary_inv', 'Trunc', 'Tozero', 'Tozero_inv']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2, 3, i + 1)
    plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([])
    plt.yticks([]) #不显示横纵坐标

plt.show()

( 4 )效果展示

在这里插入图片描述


二、 图像滤波

图像滤波也是数字图像处理中常用的一种方法,通常用于去除图像中的噪声、平滑图像等。滤波器是图像滤波的核心,它在图像上滑动,并对每个像素周围的像素进行计算,将计算结果作为该像素的输出值。


1. 均值滤波

( 1 )简单介绍

图像的简单平滑就是均值滤波,对图像中一定邻域内的像素灰度值求平均值,将平均的结果作为中心像素的灰度保存在结果图中。(在多通道图像中,每个通道需要分别计算。)

( 2 )操作实现

blur = cv2.blur(img, (3, 3))

第一个参数是图像,第二个参数是要进行均值运算的范围

( 3 )代码演示

img = cv2.imread("自行右键复制图片路径")
blur = cv2.blur(img, (3, 3))     # 均值滤波

blur = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将BGR图片转换为RGB图片
plt.imshow(blur)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 中值滤波

(1)简单介绍

其主要思想是,对中心像素矩形邻域取中值来替代中心像素。即让临近的像素按照大小排列,取排序后位于中间的像素来代替中心像素。

(2)操作实现

med = cv2.medianBlur(img, 3)

第一个参数是图像,第二个参数是卷积核

(3)代码演示

img = cv2.imread("自行右键复制图片路径")
med = cv2.medianBlur(img, 3)  # 均值滤波

med = cv2.cvtColor(med, cv2.COLOR_BGR2RGB)  # 将BGR图片转换为RGB图片
plt.imshow(med)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 高斯滤波

(1)简单介绍

高斯滤波基于高斯函数的性质,在图像中以窗口形式移动,对窗口中的像素进行加权平均操作。该加权操作是基于高斯函数的值,距离窗口中心像素越近的像素得到的权重越大,距离越远的像素得到的权重越小。这样可以使窗口中的噪声像素或细节被平滑掉,同时保留图像的整体结构和边缘信息。

(2)操作实现

Gausi = cv2.GaussianBlur(img, (3, 3), 1)

img:需要进行高斯模糊的原始图像。

(3,3):高斯核大小,指定的是一个NN的矩阵,此处为33的矩阵。

1:高斯函数方差,用来控制模糊程度。值越大,图像越模糊。常用的方差值为1、2、3。

(3)代码演示

img = cv2.imread("自行右键复制图片路径")
Gausi = cv2.GaussianBlur(img, (3, 3), 1)  # 往x方向偏移量

Gausi = cv2.cvtColor(Gausi, cv2.COLOR_BGR2RGB)  # 将BGR图片转换为RGB图片
plt.imshow(Gausi)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

4. 图像拼接

( 1 )简单介绍

在上面我们学习了三种滤波方式来优化图像,为了方便直观的展示三者的区别,我们就学习图像拼接技术,讲三张图像拼接在一起。

( 2 )操作实现

np.hstack((img, blur, med, Gausi))

参数十分简单,就直接传入要拼接的图像

( 3 )代码演示

注意下面的操作要引入对应的包,并且要附带上三张图片

res = np.hstack((img, blur, med, Gausi))

plt.imshow(res)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

( 4 )效果展示

在这里插入图片描述


写在最后

👍🏻 点赞,你的认可是我创作的动力!
⭐ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。