图像二值化:基于图像的直方图来实现的,0白色 1黑色
一 二值化
定义:图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。
一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。
二 阈值处理函数
Python-OpenCV中提供了阈值(threshold)函数
threshold(src, thresh, maxval, type, dst=None)
函数:第一个参数 src 指原图像,原图像应该是灰度图。
第二个参数 x 指用来对像素值进行分类的阈值。
第三个参数 y 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
第四个参数 Methods
method阈值类型一般分为五种:
- cv2.THRESH_BINARY——大于阈值的部分像素值变为最大值,其他变为0
- cv2.THRESH_BINARY_INV——大于阈值的部分变为0,其他部分变为最大值
- cv2.THRESH_TRUNC——大于阈值的部分变为阈值,其余部分不变
- cv2.THRESH_TOZERO——大于阈值的部分不变,其余部分变为0
- cv2.THRESH_TOZERO_INV——大于阈值的部分变为0,其余部分不变
三 全局阈值实例
import cv2 as cv import numpy as np # 全局阈值 def threshold_image(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) cv.imshow("原来", gray) # 大律法,全局自适应阈值 参数0可改为任意数字但不起作用 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) print("yuzhi:%s" % ret) cv.imshow("OTSU", binary) # TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰 ret, binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE) print("yuzhi:%s" % ret) cv.imshow("TRIANGLE", binary) # 自定义阈值为150,大于150的是白色 小于的是黑色 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY) print("yuzhi:%s" % ret) cv.imshow("define_yuzhi", binary) # 自定义阈值为150,大于150的是黑色 小于的是白色 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY_INV) print("yuzhi:%s" % ret) cv.imshow("define_rev", binary) # 截断 大于150的是改为150 小于150的保留 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TRUNC) print("yuzhi:%s" % ret) cv.imshow("jieduan1", binary) # 截断 小于150的是改为150 大于150的保留 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TOZERO) print("yuzhi:%s" % ret) cv.imshow("jieduan2", binary) src = cv.imread("yiner.jpg") threshold_image(src) cv.waitKey(0) cv.destroyAllWindows()
函数threshold()的参数说明:
#大律法,全局自适应阈值 参数0可改为任意数字但不起作用 cv.THRESH_BINARY | cv.THRESH_OTSU #TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰 cv.THRESH_BINARY | cv.THRESH_TRIANGLE # 自定义阈值为150,大于150的是白色 小于的是黑色 cv.THRESH_BINARY # 自定义阈值为150,大于150的是黑色 小于的是白色 cv.THRESH_BINARY_INV # 截断 大于150的是改为150 小于150的保留 cv.THRESH_TRUNC # 截断 小于150的是改为150 大于150的保留 cv.THRESH_TOZERO
对应的阈值
四 局部阈值处理
1 函数
adaptiveThreshold( src,
maxValue,
adaptiveMethod,
thresholdType,
blockSize,
C,
dst=None)
2 参数解说.
- 第一个src:原始图像
- 第二个maxValue:像素值上限
- 第三个自适应方法adaptiveMethod:
— cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值
—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权 重为一个高斯窗口
- 第四个值的赋值方法:
只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
- 第五个blockSize
规定领域大小(一个正方形的领域) - 第六个常数C,
阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)
这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图像都用一个阈值。
3 演示代码
import cv2 as cv import numpy as np #局部阈值 def local_yuzhi(image): gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY) cv.imshow('gray',gray) # ADAPTIVE_THRESH_MEAN_C 领域内均值 binary1=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10) cv.imshow('local1',binary1) # ADAPTIVE_THRESH_GAUSSIAN_C 领域内像素点加权和,权重为一个高斯窗口 binary2=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10) cv.imshow('local2',binary2) src = cv.imread("ying.jpg") local_yuzhi(src) cv.waitKey(0) cv.destroyAllWindows()
效果展示