opencv入门:阈值处理,自适应阈值处理,Otsu处理,均值/方框/高斯/中值滤波

您所在的位置:网站首页 阈值二值化矩阵 opencv入门:阈值处理,自适应阈值处理,Otsu处理,均值/方框/高斯/中值滤波

opencv入门:阈值处理,自适应阈值处理,Otsu处理,均值/方框/高斯/中值滤波

2023-09-10 15:21| 来源: 网络整理| 查看: 265

阈值处理

就是剔除图像内像数值高于或低于一定值的像素点。可以获得一个二值图,有效的实现的前景和背景的分离。。

OpenCV 提供了函数 cv2.threshold()和函数 cv2.adaptiveThreshold(),用于实现阈值处理。

threshold函数

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

retval 代表返回的阈值thresh 设置的阈值maxval 代表当type参数为THRESH_BINARY 或者 THRESH_BINARY_INY 类型时,需要设定的最大值type 代表阈值分割的类型 在这里插入图片描述

在这里插入图片描述

二值化阈值处理(cv2.THRESH_BINARY)

就是处理成二值图。灰度值大于阈值设为最大值,小于就是0.,,虽然都是灰度图,也可以看看彩图啊。

img=cv2.imread('5.jpg',0) t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY) # 8位图像最大值就是255,阈值设置为127 cv2.imshow("img",img) cv2.imshow("rst",rst) cv2.waitKey() cv2.destroyAllWindows()

在这里插入图片描述

反二值化阈值处理

就是跟上面倒过来。。

img=cv2.imread('5.jpg',0) t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) cv2.imshow("img",img) cv2.imshow("rst",rst) cv2.waitKey() cv2.destroyAllWindows()

在这里插入图片描述

截断阈值化处理(cv2.THRESH_TRUNC)

将大于阈值的像素设为阈值,小于或等于阈值的不变

img=cv2.imread('5.jpg',0) t,rst=cv2.threshold(img,127,255,cv2.THRESH_TRUNC) cv2.imshow("img",img) cv2.imshow("rst",rst) cv2.waitKey() cv2.destroyAllWindows()

在这里插入图片描述

超阈值零处理(cv2.THRESH_TOZERO_INV)

大于阈值的像素点设置为0,小于的就不变 在这里插入图片描述

低阈值零处理cv2.THRESH_TOZERO

小于等于阈值的像素点设置为0,大于的不变,,这个好看欸。。 在这里插入图片描述

自适应阈值处理

对于色彩均匀的图像,一个阈值就可以完成。但是色彩不均匀,只有一个阈值无法清晰有效的得到阈值分割后的图像

自适应阈值处理可以使用变换的阈值。它通过计算每个像素点周围邻近区域的加权平均值获得阈值,然后处理。这个方式可以更好的处理明暗差异较大的图像。。人类就是厉害。。

dst = cv.adaptiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, C )

src 处理的图像,注意必须时8位单通道的图像,,啊maxValue 最大值adaptiveMethod 自适应方法,见下thresholdType 阈值处理方法,必须是二值化阈值处理或反二值化阈值处理。。blockSize 块大小,计算阈值时使用的大小,通常3,5,7…

自适应阈值等于每个像素由参数 blockSize 所指定邻域的加权平均值减去常量 C,自适应方法不同计算方式也不同。

cv2.ADAPTIVE_THRESH_MEAN_C:邻域所有像素点的权重值是一致的。cv2.ADAPTIVE_THRESH_GAUSSIAN_C:与邻域各个像素点到中心点的距离有关,通 过高斯方程得到各个点的权重值。 img=cv2.imread("5.jpg",0) t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY) athdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3) athdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3) cv2.imshow("img",img) cv2.imshow("thd",thd) cv2.imshow("athdMEAN",athdMEAN) cv2.imshow("athdGAUS",athdGAUS) cv2.waitKey() cv2.destroyAllWindows()

在这里插入图片描述 可以看到,自适应阈值处理保留了更多的细节。。。感觉 athdMEAN 轮廓提取的挺好的。

Otsu处理

使用 cv2.threshold() 处理时,一般处理的时色彩均匀的,阈值设置为127就比较合适。但是当灰度级分别不均匀,阈值设置为127就会失败。比如一个图的像数值全是126.。。一处理全是0.。。

Otsu 方法可以根据当前图像给出最佳的分割阈值,就是他会历遍所有阈值,然后找出最佳。cv2.threshold()中对参数 type 给个cv2.THRESH_OTSU 就可以了。需要注意,使用Otsu 方法时,阈值设置为0.并且会返回计算得到的最佳阈值(普通的就返回设定的阈值)。

img = np.zeros((5,5),dtype=np.uint8) img[0:6,0:6]=123 img[2:6,2:6]=126 print("img=\n",img) t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY) print("thd=\n",thd) t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) print("otsu=\n",otsu) img= [[123 123 123 123 123] [123 123 123 123 123] [123 123 126 126 126] [123 123 126 126 126] [123 123 126 126 126]] thd= [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] otsu= [[ 0 0 0 0 0] [ 0 0 0 0 0] [ 0 0 255 255 255] [ 0 0 255 255 255] [ 0 0 255 255 255]] 图像平滑处理

保留图像原有信息,过滤掉图像内部的噪声,这就是平滑处理。平滑处理会对图像中与周围像素点差异较大的像素点进行处理,调整为近似值。平滑处理通常伴随着图像模糊。我们使用均值滤波,方框滤波,高斯滤波,中值滤波,双边滤波, 2D 卷积(自定义滤波),

图像滤波时图像处理和计算机视觉中最常用最基本的操作。。芜湖。图像滤波允许在图像上进行各种操作。有时也把图像平滑处理称为图像滤波,图像模糊处理啥的。。

均值滤波

是指使用像素点周围N X N 个像素值的均值来替换当前像数值。使用这个方法遍历处理图像每个点就可以完成均值滤波。如果N越大,参与运算的像素点越多,图像失真越严重。 dst = cv2.blur( src, ksize, anchor, borderType )

src原图像,可以是任意通道,并能对各个通道独立处理。ksize 滤波核的大小,就是邻域图像的高度和宽度,(5,5) 就是 5X5 大小做均值。anchor 锚点,默认(-1,-1) ,表示当前计算均值的点位与核的中心位置。特殊情况下可以指定别的点borderType 边界样式,决定了如何处理边界,一般用默认就行。

归一化的卷积核,,别不认识。。。M,N 表示邻域的行列大小。意会意会。。

在这里插入图片描述 o=cv2.imread("5.jpg") r=cv2.blur(o,(5,5)) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows()

在这里插入图片描述 模糊的有点大。。。。

方框滤波

这个不会计算像素平均值,这个可以自由旋转是否对均值滤波的结果归一化,就是可以选择滤波结果时领域像素值之和的凭自己,还是领域像素值之和。。。

dst = cv2.boxFilter( src, ddepth, ksize, anchor, normalize, borderType )

ddepth 时处理结果图像的图像深度,一般使用-1 与原图相同normalize 是否归一化,1 表示用均值,0表示用邻域像素值之和。默认1跟均值滤波一样。 o=cv2.imread("5.jpg") r=cv2.boxFilter(o,-1,(2,2),normalize=0) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows()

在这里插入图片描述

啥也看不到了。。。

高斯滤波

均值和方波滤波,邻域每个像素的权重都是相等的,高斯滤波中,中心点权重加大,各个像素有不同的权重。

卷积核的值不再都是1,dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )

ksize 滤波核,需要注意这要是奇数sigmaX 卷积核在水平方向上 X轴方向 的标准差,控制的时权重比例。sigmaY 垂直方向Y 轴方向的标准差,,如果值为0,就采用sigmaX 的值。如果这两个都是0,通过ksize.wise ksize.height 计算得到。sigmaX = 0.3×[(ksize.width-1)×0.5-1] + 0.8, sigmaY = 0.3×[(ksize.height-1)×0.5-1] + 0.8

sigmaX 是必选的,但是可以设置为0,让函数自己去算。

o=cv2.imread("5.jpg") r=cv2.GaussianBlur(o,(5,5),0,0) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows() # 反正就是模糊,,PS里不就常用高斯模糊嘛。。。 中值滤波

这个不用加权求均值的方法了,使用所有像素的中间值来替代

dst = cv2.medianBlur( src, ksize)

o=cv2.imread("image\\lenaNoise.png") r=cv2.medianBlur(o,3) cv2.imshow("original",o) cv2.imshow("result",r) cv2.waitKey() cv2.destroyAllWindows()

中值滤波不存在均值滤波等方式带来的细节模糊问题,可以几乎不影响原图的情况下去除噪声,但运算量大。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3