个人的简单理解:自定义一个你想要到达的阈值,当这张图像的像素点到达阈值时,对图像进行相应的操作。
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()
运行结果如图所示:
好了,今天这篇文章就结束了,楼主会尽量多更。