彩色图像:三个通道:0-255,0-255,0-255,所以可以有2^24位空间
灰度图像:一个通道:0-255,所以有256种颜色
二值图像:只有两种颜色:黑和白,1白色(255) 0黑色(0)
double threshold(InputArray src, OutputArray dst, double thresh,
double maxval, int type)
->retval,dst
此外,特殊值#THRESH_OTSU或#THRESH_TRIANGLE可以与上述值之一组合。 在这些情况下,函数使用Otsu或Triangle算法确定最佳阈值,并使用它而不是指定的阈值。
def threshold_demo(image):
gray = cv.cvtColor(image,cv.COLOR_RGB2GRAY) #要二值化图像,要先进行灰度化处理
ret, binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)
print("threshold value: %s"%ret) #打印阈值,前面先进行了灰度处理0-255,我们使用该阈值进行处理,低于该阈值的图像部分全为黑,高于该阈值则为白色
cv.imshow("binary",binary) #显示二值化图像
第一个返回值,得到图像的阈值,
第二个返回值,也就是阈值处理后的图像,
cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)
我们自己不一定能够找到一个最好的阈值,去二分化图像,所以我们需要算法自己去寻找一个阈值,而cv.THRESH_OTSU就可以满足这个需求,去找到一个最好的阈值。
注意:大津法非常适用于图像灰度直方图具有双峰的情况,他会在双峰之间找到一个值作为阈值,对于非双峰图像,可能并不是很好用。
因为cv.THRESH_OTSU方法会产生一个阈值,那么函数cv2.threshold的的第二个参数(设置阈值)就是0(None)了,并且在cv2.threshold的方法参数中还得加上语句cv2.THRESH_OTSU。
这里面第三个参数maxval参数表示与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。而我们使用的灰度图像最大则为255,所以设置为255即可。
ret, binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
容易造成图像丢失,适用于图像灰度直方图具有单个波峰的情况,最开始用于医学分割细胞等
1)THRESH_BINARY_INV大于阈值的都为0
ret, binary = cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)
ret, binary = cv.threshold(gray,127,255,cv.THRESH_TRUNC
ret, binary = cv.threshold(gray,127,255,cv.THRESH_TOZERO)
在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果。而自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处:
每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。
亮度较高的图像区域的二值化阈值通常会较高,而亮度低的图像区域的二值化阈值则会相适应的变小。
不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod,
int thresholdType, int bolckSize, double C)
->dst
自适应阈值化计算大概过程是为每一个象素点单独计算的阈值,即每个像素点的阈值都是不同的,就是将该像素点周围B*B区域内的像素加权平均,然后减去一个常数C,从而得到该点的阈值。B由参数bolckSize指定,常数C由参数C指定。
ADAPTIVE_THRESH_MEAN_C,为局部邻域块的平均值,该算法是先求出块中的均值,再减去常数C。
ADAPTIVE_THRESH_GAUSSIAN_C,为局部邻域块的高斯加权和。该算法是在区域中(x, y)周围的像素根据高斯函数按照他们离中心点的距离进行加权计算,再减去常数C。
def local_demo(image):
img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
img1 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 5, 4)
cv.imshow("img1", img1)
img1 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 5, 4)