二值化函数作用:图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
一)简单阈值
简单阈值当然是最简单,选取一个全局阈值,然后就把整幅图像分成了非黑即白的 二值图像
这个函数有四个参数,第一个原图像,第二个进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有:
• cv2.THRESH_BINARY(黑白二值)
• cv2.THRESH_BINARY_INV(黑白二值反转)
• cv2.THRESH_TRUNC (得到的图像为多像素值)
• cv2.THRESH_TOZERO
• cv2.THRESH_TOZERO_INV
该函数有两个返回值,第一个retVal(得到的阈值值(在后面一个方法中会用到)),第二个就是阈值化后的图像。
import matplotlib.pyplot as plt
import cv2
src = cv2.imread('test.png')
image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
ret, threshold_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharex=True, sharey=True)
ax1.axis('off')
ax1.imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB))
ax1.set_title('Input image')
# Rescale histogram for better display
threshold_rescaled = exposure.rescale_intensity(threshold_image, in_range=(0, 10))
ax2.axis('off')
ax2.imshow(threshold_rescaled, cmap=plt.cm.gray)
ax2.set_title('threshold')
plt.show()
实例如下:
![](https://img.haomeiwen.com/i1157129/92ca23ad2b78247f.png)
二)自适应阈值:
前面看到简单阈值是一种全局性的阈值,只需要规定一个阈值值,整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点是属于黑或者白(如果是二值情况)。使用的函数为:cv2.adaptiveThreshold()
该函数需要填6个参数:
第一个原始图像
第二个像素值上限
第三个自适应方法Adaptive Method:
— cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值
—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权 重为一个高斯窗口
第四个值的赋值方法:只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
第五个Block size:规定领域大小(一个正方形的领域)
第六个常数C,阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)
这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图像都用一个阈值。
import matplotlib.pyplot as plt
from skimage.feature import hog
from skimage import data, exposure
import cv2
src = cv2.imread('12.JPG')
image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
threshold_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY_INV,19,7)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4), sharex=True, sharey=True)
ax1.axis('off')
ax1.imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB))
ax1.set_title('Input image')
# Rescale histogram for better display
threshold_rescaled = exposure.rescale_intensity(threshold_image, in_range=(0, 10))
ax2.axis('off')
ax2.imshow(threshold_rescaled, cmap=plt.cm.gray)
ax2.set_title('threshold')
plt.show()
实例如下:
![](https://img.haomeiwen.com/i1157129/60e8e3b32b730904.png)
三)自适应阈值处理 与 OTSU阈值处理 的差异:
自适应阈值处理是按照blocksize的尺寸,逐个像素找阈值,也就是说,处理每个像素所用的阈值是不一样的。这也就是为啥返回值没有 threshold。
OTSU阈值处理,会给图像找一个统一使用的阈值,所有的像素都是按照这个阈值处理的。返回值有两个,第一个返回值就是threshold。
自适应阈值在光照不均匀,或者有阴影遮挡的时候有比较好的处理结果,自然需要更多的处理时间。
网友评论