opencv二值化详解

二值化
学习了二值化,我通过看了很多资料,希望通过总结和大家一起学习,一起努力,有错误,希望大家指正
在处理图片操作时,二值化在图片领域占有很大作用
在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓
opencv中,提供了多种二值化方法
以8位图为例(即值为0-255)
方法one: cv2.THRESH_BINARY | 像素灰度值小于阈值全为0,大于阈值全为255 |
---|---|
方法two: cv2.THRESH_BINARY_INV | 像素灰度值小于阈值全为255,大于阈值全为0 |
方法tree: cv2.THRESH_TRUNC | 像素灰度值小于阈值不变,大于阈值变为阈值 |
方法four: cv2.THRESH_TOZERO | 像素灰度值小于阈值不做任何改变,大于阈值全为0 |
方法five: cv2.THRESH_TOZERO_INV | 像素灰度值小于阈值全为0,大于阈值不做任何改变 |
公式如下
二值化方法
cv2.threshold(src, thresh, maxval, type)
src: 图片源
thresh: 阈值
maxval: 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
type: 表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BINARY)
OTSU算法
一般,我们不知道用什么阈值可以获得更好的二值化图像.OTSU会通过一系列计算,计算出,比较优的阈值(可以理解为,在
图像直方图中,如果存在两峰,那么,我们的阈值应该尽可能的在两峰之间的峰谷).因此,对于非双峰图,用这种方法可能效果
不太理想
OTSU是计算二值化的算法,计算二值化的算法有很多,一般使用OTSU
下面使用OTSU算法实现THRESH_BINARY二值化
import cv2 as cv
path=''
image=cv.imread(path)
image=cv.cvtColor(image,cv.COLOR_RGB2GRAY)
ret,binary=cv.threshold(image,0,255,cv.THRESH_BINARY + cv.THRESH_OTSU)
print('峰值为:',ret) # ret为OTSU算法得出的阈值
cv.imshow('THRESH_BINRY',binary)
cv.waitKey(0)
cv.destroyAllWindows()
下面不适应OTSU算法实现THRESH_TRUNC
import cv2 as cv
path=''
image=cv.imread(path)
image=cv.cvtColor(image,cv.COLOR_RGB2GRAY)
ret,binary=cv.threshold(image,127,255,cv.THRESH_TRUNC) # 这里指定127为阈值
print('峰值为:',ret) # ret为阈值
cv.imshow('THRESH_BINRY',binary)
cv.waitKey(0)
cv.destroyAllWindows()
以上为全局二值化,下面介绍一下,局部二值化
局部二值化方法
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
src: 图像源
maxValue: 灰度像素值上限,举例为8位图(255)
adaptiveMethod: 自适应算法:两种{1:cv2.ADAPTIVE_THRESH_MEAN_C 采用领域内均值2:cv2.ADAPTIVE_THRESH_GAUSSIAN_C 采用领域内像素加权和,权重为高斯窗口}
thresholdType: 为二值化算法,只适用于(cv2.THRESH_BINARY and cv2.THRESH_BINARY_INV)
blockSize: 领域大小,为正方形
C: 阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)
这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图像都用一个阈值。
imprt cv2 as cv
path=''
image=cv.imread(path)
image=cv.cvtColor(image,cv.COLOR_RGB2GRAY)
binary=cv.adaptiveThreshold(image,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2)
cv.imshow('ADAPTIVE_THRESH_MEAN_C',binary)
cv.waitKey(0)
cv2.destroyAllWindows()
以上是我学习二值化后的一些总结,不好之处,欢迎评论,一起学习




更多推荐
所有评论(0)