基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)

一、阈值处理用于处理单通道图像(一般是灰度图),它能够简化图像的像素值,使图像的像素值更为单一,便于处理,通俗的理解就是将灰度图变为黑白图。以下是Opencv的一种阈值处理方式。

函数介绍

ret,dst = cv2.threshold(src,thresh,maxval,type)

src :要进行处理的单通道图像,一般为灰度图。

thresh:设定的阈值,超过或小于该值像素将会转换为特定的值。

maxval = 当像素超过(或者小于)阈值将会被赋予的值,具体是超过还是小于要看type的类型。

type:决定了阈值处理的类型,threshold共有以下几种简单阈值处理类型。

cv2.THRESH_BINARY:超过阈值部分取maxval,小于阈值部分则取0。

cv2.THRESH_BINARY_INY:加_INY的意思是反转该函数,即超过阈值部分取0,小于阈值部分取maxval.

cv2.THRESH_TRUNC:超过阈值部分设为阈值,小于阈值部分不变。(这种type类型处理过后的图像不是二值图像,因为小于阈值的部分没有被改变。)

cv2.THRESH_TOZERO:大于阈值部分不改变,小于阈值部分设为0.(这种type类型处理过后的图像同样不是二值图像,因为小于阈值的部分没有被改变。)

cv2.THRESH_TOZERO_INY:上个函数的反转,即大于阈值的部分设为0,小于阈值的部分不改变。(这种type类型处理过后的图像同样不是二值图像)

下面代码中其他基础函数的介绍可以参考这篇博客

关于函数的返回值:

ret,dst  = cv2.threshold(src,thresh,maxval,type)函数共有两个返回值,第一个返回值ret等于函数中设定的阈值thresh,第二个参数dst保存的则是处理过后的图像。

以下是对这几种阈值处理类型的应用代码和对比效果图

import cv2 #导入相关包
import numpy as np
import matplotlib.pyplot as plt
img_cat = cv2.imread("cat.jpeg")#读入要处理的彩色图
img_cat = cv2.cvtColor(img_cat,cv2.COLOR_BGR2GRAY)#将其转化为灰度图
cv2.imshow("cat_gray",img_cat)#展示要进行处理的灰度图
cv2.waitKey(0)
cv2.destroyAllWindows()#关闭窗口
ret,thresh1 = cv2.threshold(img_cat,127,255,cv2.THRESH_BINARY)#对灰度图进行处理,超过127部分取255,否则取0
ret,thresh2 = cv2.threshold(img_cat,127,255,cv2.THRESH_BINARY_INV)#后缀为INY则表示与原函数作用相反,超过127部分取0,否则取255
ret,thresh3 = cv2.threshold(img_cat,127,255,cv2.THRESH_TRUNC)#大于阈值部分设为阈值,否则不变
ret,thresh4 = cv2.threshold(img_cat,127,255,cv2.THRESH_TOZERO)#大于阈值部分设为阈值,其他为0
ret,thresh5 = cv2.threshold(img_cat,127,255,cv2.THRESH_TOZERO_INV)#大于阈值部分设为0,其他为阈值
titles = ["Oringinal_img","THRESH_BINARY","THRESH_BINARY_INY","THRESH_TRUNC","THRESH_TOZERO","THRESH_TOZERO_INY"]#这里表示的是下面每张图片上方的标题
imges = [img_cat,thresh1,thresh2,thresh3,thresh4,thresh5]#将所要展示的图片放在一起形成列表
for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(imges[i],"gray")#这里的subplot函数意为显示2行三列图片,现在显示的是第i+1张,plt.imshow用于显示当前图片
    plt.title(titles[i])#显示标题
    plt.xticks([]),plt.yticks([])#将默认的X轴和Y轴消掉,可以试着将它注释掉看看效果
plt.show()#注意区分一下showh和imshow的区别,imshow只是在后台将图画出,而show函数会将当前画好的图片全部显示出来。

运行结果

原图

基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)_第1张图片

这是处理后的灰度图

基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)_第2张图片

这是几种不同阈值处理类型的效果对比图,我们可以清楚的看出,这些图像的像素点对比上面的灰度图都得到了极大的简化。

 基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)_第3张图片

 关于图像的噪声以及Opencv的三种滤波方式

图像噪声是指存在于图像数据中的不必要的或多余的干扰信息。噪声的存在严重影响了遥感图像的质量,因此在图像增强处理和分类处理之前,必须予以纠正。 [1]  图像中各种妨碍人们对其信息接受的因素即可称为图像噪声 。噪声在理论上可以定义为“不可预测,只能用概率统计方法来认识的随机误差”。因此将图像噪声看成是多维随机过程是合适的,因而描述噪声的方法完全可以借用随机过程的描述,即用其概率分布函数和概率密度分布函数。比如下面这张图片上的白色噪声点就是图像噪声的直观体现,它是图像信息的缺失,而滤波则是处理图像噪声的一种方式。

基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)_第4张图片

关于三种滤波函数的介绍:

 blur = cv2.blur(img_test2,(3,3)):均值滤波,它会计算出图像白点周围其他像素点的均值,并将其赋值给白色噪声点,以此来减少噪声点。img_test2是要进行滤波处理的图像,(3,3)表示要取周围多大范围像素点的均值,这个可以看情况自行设定,一般为(3,3),(5,5)和(7,7)等奇数。

box = cv2.boxFilter(img_test2,-1,(3,3),normalize = True):方框滤波(进行归一化处理),这里的img_test2表示要进行处理的图像,而-1则表示按照原图的深度展示处理后的图像,(3,3)跟上面的函数一样表示像素点范围,normalize = True表示进行归一化处理,原理上均值滤波和方框滤波是一样的,而如果进行归一化处理,那么两者的处理结果也可以认为是一样的。

box = cv2.boxFilter(img_test2,-1,(3,3),normalize = False):方框滤波(不进行归一化处理),处理结果跟上面两种方式差别很大,下面会有展示,不进行归一化处理可以理解为只是将内核中的像素值加起来,但除以分母,这样的话就会发生溢出现象,大量像素点的值都会变成255,也就是会出现大面积的白色,不归一化一般用于计算每个像素邻域上的各种积分特性,方差、协方差,平方和等等。

aussian = cv2.GaussianBlur(img_test2,(3,3),1):高斯滤波,原理可以理解为加权平均,也就是说跟白色噪声点的像素距离不同,加权比重也会不同,离得越近,所占比重越大,1则表示取标准差为1。

median = cv2.medianBlur(img_test2,5):中值滤波,原理是对范围内的像素点值进行排序,将中值赋值给白色噪声点,它在处理噪声方面非常常用,缺点是由于需要进行排序,所以需要消耗的时间比均值滤波等方式长。

下面是对几种处理方式的应用代码

import cv2
import numpy as np
import matplotlib.pyplot as plt
img_test1 = cv2.imread("test1.png")#读入带有噪声的图像
cv2.imshow("tset1",img_test1)#展示该图像
cv2.waitKey(0)
cv2.destroyAllWindows()#关闭窗口
blur = cv2.blur(img_test2,(3,3))#对图像采用均值滤波并赋值
cv2.imshow("blur",blur)#展示处理过后的图像
cv2.waitKey(0)
cv2.destroyAllWindows()#关闭窗口
#方框滤波(进行归一化处理,其实和均值非常类似)
box = cv2.boxFilter(img_test2,-1,(3,3),normalize = True)#对图像采用方框滤波并赋值
cv2.imshow("box",box)
cv2.waitKey(0)
cv2.destroyAllWindows()
#方框滤波(不进行归一化处理)
box1= cv2.boxFilter(img_test2,-1,(3,3),normalize = False)#对图像采用方框滤波并赋值
cv2.imshow("box",box1)#展示处理后的图像
cv2.waitKey(0)
cv2.destroyAllWindows()
#高斯滤波(加权平均)
aussian = cv2.GaussianBlur(img_test2,(3,3),1)#高斯滤波处理
cv2.imshow("aussian",aussian)#展示图像
cv2.waitKey(0)
cv2.destroyAllWindows()
#中值滤波(比较常用)
median = cv2.medianBlur(img_test2,5)#对图片进行中值滤波处理
cv2.imshow("median",median)#展示图像
cv2.waitKey(0)
cv2.destroyAllWindows()
All = np.hstack((blur,box,median))#将三张图片横向拼接进行对比
cv2.imshow("All",All)#展示该图像
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

原图

基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)_第5张图片

均值滤波

基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)_第6张图片

方框滤波(归一化)

基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)_第7张图片

方框滤波(不进行归一化)

基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)_第8张图片

高斯滤波

基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)_第9张图片

中值滤波

基于python的Opencv图像基本操作2(简单阈值处理和三种滤波方式对图像噪声的处理)_第10张图片

 横向对比图

从左至右分别为均值滤波,高斯滤波,均值滤波 

 可以看到,中值滤波对于单极或双极(椒盐噪声)或者说分布比较分散的噪声有极好好的处理效果,它能够很好地滤除脉冲噪声,同时又能够保护目标图像边缘(就是处理时间会比较长)。

你可能感兴趣的:(笔记,opencv,计算机视觉,人工智能)