图像阈值
- 图像阈值处理就是从目标图像中将大于或者小于一定值得像素进行处理,最后得到我们需要的部分图像。具体怎么操作要取决于cv2.threshold(src,thresh,maxval,type)中的type参数的值。
ret,dst = cv2.threshold(src,thresh,maxval,type)
- src:输入图像,必须是单通道图像,通常是灰度图
- dst: 输出图像
- thresh:阈值
- type: 二值化操作的类型,包含以下五种类型(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:与BINARY的情况刚刚相反
cv2.THRESH_TRUNC:大于阈值的部分,设置为阈值。否则不变。
cv2.THRESH_TOZERO:大于阈值的部分不改变,否则设置为0
cv2.THRESH_TOZERO_INV:TOZERO的反转。
img_dog = cv2.resize(img_dog,(455,540))
print(img_dog)
cv2.imshow("img_dog",img_dog)
cv2.waitKey(0)
ret,dst = cv2.threshold(img_dog,127,255,cv2.THRESH_BINARY)
print(dst.shape)
print(dst)
cv2.imshow("cv2.THRESH_BINARY",dst)
cv2.waitKey(0)
其他四种代码如下:
ret,BINARY_INV = cv2.threshold(img_dog,127,255,cv2.THRESH_BINARY_INV)
ret,THRESH_TRUNC = cv2.threshold(img_dog,127,255,cv2.THRESH_TRUNC)
ret,THRESH_TOZERO= cv2.threshold(img_dog,127,255,cv2.THRESH_TOZERO)
ret,THRESH_TOZERO_INV = cv2.threshold(img_dog,127,255,cv2.THRESH_TOZERO_INV)
titles = ["origial image","BINARY_INV","TRUNC","TOZERO","TOZERO_INV"]
images =[img_dog,BINARY_INV,THRESH_TRUNC,THRESH_TOZERO,THRESH_TOZERO_INV]
for i in range(5):
plt.subplot(1,5,i+1)
plt.title(titles[i])
plt.imshow(images[i],"gray")
plt.xticks([])
plt.yticks([])
plt.show()
效果如下图所示:
图像平滑
消除图像中的噪声成分叫作图像的平滑化或滤波操作。
滤波:
- 高频:目标像素跟周边像素相差表较大,其实也就是灰度变化快。一般来说,图像和背景的边缘部分就会有很大的差别。噪点与正常点的颜色也不相同,有明显的变化 ,所以大部分情况下是高频部分。
2.目的:模糊、消噪。(也可以利用滤波来抽出对象的特征作为图像识别的特征模式)
3.方法:线性滤波(方框滤波、均值滤波、高斯滤波),非线性滤波(中值滤波、双边滤波)
均值滤波
def blur(src: Any,
ksize: Any,
dst: Any = None,
anchor: Any = None,
borderType: Any = None) -> None
1.均值滤波从频域来看,它是一种低通滤波器,高频信号会被滤掉。均值滤波可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均值滤波是用每个像素和它周围像素计算出来的平均值替换图像中每个像素。
方框滤波
def boxFilter(src: Any,
ddepth: Any,
ksize: Any,
dst: Any = None,
anchor: Any = None,
normalize: Any = None,
borderType: Any = None) -> None
基本和均值滤波一样,可以选择归一化
第二个参数-1的意思就是输出图像的颜色通道数和输入是一样的。通常不需要去改。如果选择归一化normalize=True,那么就和均值滤波没什么区别。如果选择False后,进行操作的时候如果大于255,就直接取255。
高斯滤波
高斯滤波的重要两步就是先找到高斯模板然后再进行卷积。模板中的数据是符合高斯分部的。
中值滤波
在卷积核大小的范围内,对原来图像像素值先进行排序,然后去中间的值当做像素点。(ksize的值一定是奇数,偶数会报错)
代码(包括如何生成椒盐图):
img_original = cv2.imread("dog.jpg")
img= cv2.resize(img_original,(440,540))
noise = 5000
img_noise= np.array(img)
for k in range(0,noise):
xi = int(np.random.uniform(0,img_noise.shape[1]))
xj = int(np.random.uniform(0,img_noise.shape[0]))
img_noise[xj,xi] = 0
cv2.imshow("img_rere",img_noise)
img_mblur = cv2.medianBlur(img_noise,3)
cv2.imshow("img_mblur",img_mblur)
cv2.waitKey(0)
其他知识点:
1.图像二值化( Image Binarization): 就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
2.如果在代码中需要输出很多图,想把他们放在一起输出,那么就可以使用np.hstack(img1.img2,img3.....)