【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 )效果展示

在这里插入图片描述


写在最后

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Python,可以使用不同的图像滤波器来实现阈值操作。其最大值滤波器可以增强图像的亮点,最小值滤波器用于增强图像最暗的点,滤波器则最常用于去除椒盐噪声和脉冲噪声。 如果你想使用最大值滤波器进行阈值操作,可以使用以下代码: ```python import cv2 import numpy as np import scipy if __name__ == '__main__': src = cv2.imread('wave.jpg', 0) dst = scipy.ndimage.filters.maximum_filter(src, size=5) cv2.imshow('src', src) cv2.imshow('maximum filter', dst) cv2.waitKey() cv2.destroyAllWindows() ``` 这段代码会加载名为'wave.jpg'的图像,然后使用最大值滤波器对图像进行处理并显示结果。 如果你想使用最小值滤波器进行阈值操作,可以使用以下代码: ```python import cv2 import numpy as np import scipy if __name__ == '__main__': src = cv2.imread('wave.jpg', 0) dst = scipy.ndimage.filters.minimum_filter(src, size=5) cv2.imshow('src', src) cv2.imshow('minimum filter', dst) cv2.waitKey() cv2.destroyAllWindows() ``` 这段代码会加载名为'wave.jpg'的图像,然后使用最小值滤波器对图像进行处理并显示结果。 如果你想使用滤波器进行阈值操作,可以使用以下代码: ```python import cv2 import numpy as np import scipy if __name__ == '__main__': src = cv2.imread('images/pcb_noise.jpg', 0) dst = scipy.ndimage.filters.median_filter(src, size=5) cv2.imshow('src', src) cv2.imshow('median filter', dst) cv2.waitKey() cv2.destroyAllWindows() ``` 这段代码会加载名为'pcb_noise.jpg'的图像,然后使用滤波器对图像进行处理并显示结果。 需要注意的是,上述代码使用了OpenCV库、NumPy库和SciPy库,确保你已经安装了这些依赖库才能运行代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数字图像处理Python实现-经典图像图像滤波](https://blog.csdn.net/wujuxKkoolerter/article/details/130140669)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畅游星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值