小白学python(opencv图像二值化)
- 知识回顾
- 图像二值化
- 图像二值化的实现
- 全局阈值
- 局部阈值
知识回顾
在图像二值化之前,让我们先了解下图像的基本知识。
这也算是对我前面的一个小小的回顾叭,里面有摘抄大佬的精彩解释也有我自己的一点拙见。
一个像素点的颜色是由RGB三个值来表现的,所以一个像素点
矩阵对应三个颜色向量矩阵,分别是R矩阵,G矩阵,B矩阵,
它们也都是同样大小的矩阵。
在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue)
即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的取值
范围均为0~255,比如电脑屏幕上的一个红色的像素点的三个分量
的值分别为:255,0,0。
在理解了一张图片是由一个像素点矩阵构成之后,我们就知道
我们对图像的处理就是对这个像素点矩阵的操作,想要改变某个
像素点的颜色,我们只要在这个像素点矩阵中找到这个像素点的
位置,比如第x行,第y列,所以这个像素点在这个像素点矩阵中的
位置就可以表示成(x,y),因为一个像素点的颜色由红、绿、蓝
三个颜色变量表示,所以我们通过给这三个变量赋值,来改变这个
像素点的颜色,比如改成红色(255,0,0),可以表示为
(x,y,(R=255,G=0,B=0))。
图像灰度化就是让像素点矩阵中的每一个像素点都满足下面的关系:
R=G=B
二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)
或者255(白色),也就是让整个图像呈现只有黑和白的效果。
在灰度化的图像中灰度值的范围为0~255,在二值化后的图像中的
灰度值范围是0或者255。
图像二值化
定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,
也就是将整个图像呈现出明显的只有黑和白的视觉效果。
一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像
直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像
的数据分成两部分:大于T的像素群和小于T的像素群。这是研究
灰度变换的最特殊的方法,称为图像的二值化(Binarization)。
(百度大法好)
图像二值化的实现
全局阈值
threshold()
第一个参数 src 指原图像,原图像应该是灰度图。
第二个参数 x 指用来对像素值进行分类的阈值。
第三个参数 y 指当像素值高于(有时是小于)
阈值时应该被赋予的新的像素值
第四个参数 Methods 指不同的不同的阈值方法
def threshold_demo(image):#图像二值化
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
ret,binary= cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)
print("%s"%ret)
cv.imshow("binary",binary)
这里用的是cv.THRESH_BINARY|cv.THRESH_OTSU全局阈值方法,
结果:
我们再换一种方法(cv.THRESH_BINARY|cv.THRESH_TRIANGLE三角阈值法)
def threshold_demo(image):#图像二值化
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
ret,binary= cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_TRIANGLE)
print("%s"%ret)
cv.imshow("binary",binary)
我们也可以自定义阈值来截取,即将第二个参数自定义为阈值,第四个参数中只用cv.THRESH_BINARY(一种处理方法),不用加任何自动取阈值方法。
def threshold_demo(image):#图像二值化
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
ret,binary= cv.threshold(gray,144,255,cv.THRESH_BINARY)
print("%s"%ret)
cv.imshow("binary",binary)
局部阈值
当同一幅图像上的不同部分的具有不同亮度时。这种情况下
我们需要采用局部阈值。此时的阈值是根据图像上的每一个小
区域计算与其对应的阈值。因此在同一幅图像上的不同区域
采用的是不同的阈值,从而使我们能在亮度不同的情况下得到
更好的结果。
cv2.adaptiveThreshold()
第一个参数 src 指原图像,原图像应该是灰度图。
第二个参数 x 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
第三个参数 adaptive_method 为 CV_ADAPTIVE_THRESH_MEAN_C
或 CV_ADAPTIVE_THRESH_GAUSSIAN_C
第四个参数 threshold_type 指取阈值类型:必须是下者之一 • CV_THRESH_BINARY, • CV_THRESH_BINARY_INV
第五个参数 block_size 用来计算阈值的象素邻域大小: 3, 5, 7, ...
第六个参数 param1 与方法有关的参数。对方法 CV_ADAPTIVE_THRESH_MEAN_C
和 CV_ADAPTIVE_THRESH_GAUSSIAN_C,
代码:
def local_threshold(image): #图像二值化2局部阈值
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
binary = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10)
cv.imshow("binary", binary)
运行效果: