写在前面
本篇文章是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 )效果展示
写在最后
👍🏻 点赞,你的认可是我创作的动力!
⭐ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net