Opencv3基础操作2——阈值与平滑

文章目录

图像阈值

个人的简单理解:自定义一个你想要到达的阈值,当这张图像的像素点到达阈值时,对图像进行相应的操作。
ret, dst = cv2.threshold(src, thresh, maxval, type)
ret: 返回的阈值(此返回值没啥用,就是你定义的阈值)
src: 输入图,只能输入单通道图像,通常来说为灰度图
dst: 输出图
thresh: 阈值,经常使用127
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的反转
下面看一个例子:
先引入必要的包:

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

img=cv2.imread('cat.jpg')#读入照片
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#进行灰度处理
#img_gray.shape
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

titles = ['Original Image', '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()

运行结果如图

图像平滑

图像可能本身含有很多噪点,如果直接用来训练模型效果可能不是很好,所以我们要对图像进行去噪,即为平滑处理。
卷积事例
导入图像:

img = cv2.imread('lenaNoise.png')

cv2.imshow('img', img)//显示图片
cv2.waitKey(0)//按任意键退出
cv2.destroyAllWindows()//销毁窗口

看一下原图照片:
在这里插入图片描述
图片中有很多白点,即为噪声。
下面我们开始对图片进行去噪。
1.均值滤波
顾名思义,均值滤波的处理方法就是把filter过滤器选为全为1的矩阵,如上图我们选择了3*3的过滤器,再对图像进行卷积操作。
在这里插入图片描述
卷积完成以后把这九个数字相加取平均值,(121+75+78+24+204+113+154+104+235)/9=123.11,然后中间的204会被替换为123.11。

# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))#(3,3)为filter的大小,一般取3,5,7.。。

cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如图所示:
在这里插入图片描述
2.方框滤波
方框滤波跟均值滤波基本相同,其中的-1参数大可不必管他,唯一多了一个normalize,当normalize = True时跟方框滤波完全相同,即相加除9得平均值(即为归一化操作)。

# 方框滤波
# 基本和均值一样,可以选择归一化
box = cv2.boxFilter(img,-1,(3,3), normalize=True)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如图所示:
在这里插入图片描述
当normalize = false时,相加不除9(即没有归一化操作),此时相加如果>255则取值为255。

# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界,越界都取255
box = cv2.boxFilter(img,-1,(3,3), normalize=False)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如图所示:

在这里插入图片描述
3.高斯滤波
首先不要被这个名字吓住了,我们看看高斯函数及其图像:
在这里插入图片描述
在这里插入图片描述
即越靠近 μ \mu 概率越大,则我们可以推导出,越靠近中心点(此处为204)权重越大,则此时可以设置filter为
在这里插入图片描述

# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1)  #1为标准差

cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如图所示:
在这里插入图片描述
4.中值滤波
中值滤波就是把数值从小到大排序取中间值,如上面的33卷积的例子,把24,75,78,104,113,121,154,204,235依次排好序后,中间值就是113,然后204变为113。(事例中我们用了55的filter)。

# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5)  # 中值滤波

cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如图所示:
在这里插入图片描述
可见中值滤波处理最好。
这里有个小技巧,我们想把多个图像一起输出时,可以用numpy把它们拼接在一起。以下两个例子把均值滤波(blur)、高斯滤波(aussian)和中值滤波(median)拼接到了一起。
横着拼接:

# 展示所有的
res = np.hstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如图所示:
在这里插入图片描述
竖着拼接:

# 展示所有的
res = np.vstack((blur,aussian,median))
#print (res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如图所示:
在这里插入图片描述
好了,今天这篇文章就结束了,楼主会尽量多更。

原创文章 3 获赞 2 访问量 333

猜你喜欢

转载自blog.csdn.net/Hai__hello/article/details/105497690