图像的阈值处理

介绍阈值

       图像是由矩阵构成,矩阵中每个点的RGB值都不一样,呈现出来的色彩不一样,最终整体呈现给我们的就是一张彩色的图像。所谓”二值化处理“就是将矩阵中每个点的RGB值(0,0,0)[黑色]或者(255,255,255)[白色], 设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群, 提取出目标物体。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。

       阈值分割法的特点是:适用于目标与背景灰度有较强对比的情况,重要的是背景或物体的灰度比较单一,而且总可以得到封闭且连通区域的边界。

一 简单阈值

函数为cv2.threshold( ), 选取一个全局阈值,然后就把整幅图像分成非黑即白的二值图像

"""cv2.threshold( )函数四个参数,
第一个是原图像矩阵,
第二个是进行分类的阈值,
第三个是高于(低于)阈值时赋予的新值,
第四个是一个方法选择参数,常用的有:

cv2.THRESH_BINARY(黑白二值)
cv2.THRESH_BINARY_INV(黑白二值翻转)
cv2.THRESH_TRUNC(得到额图像为多像素值)
cv2.THRESH_TOZERO(当像素高于阈值时像素设置为自己提供的像素值,低于阈值时不作处理)
cv2.THRESH_TOZERO_INV(当像素低于阈值时设置为自己提供的像素值,高于阈值时不作处理)

注:将阈值大于127的像素值置为255


函数两个返回值

第一个值为阈值
第二个就是阈值处理后的图像矩阵


"""

img = cv2.imread('4.jpg', 0)
# binary (黑白二值)
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  
# (黑白二值反转)
ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) 

# 得到的图像为多像素值 
ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC) 

# 高于阈值时像素设置为255,低于阈值时不作处理
ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)  
# 低于阈值时设置为255,高于阈值时不作处理
ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)  
 
print(ret)
 
cv2.imshow('thresh1', thresh1)
cv2.imshow('thresh2', thresh2)
cv2.imshow('thresh3', thresh3)
cv2.imshow('thresh4', thresh4)
cv2.imshow('thresh5', thresh5)
cv2.imshow('grey-map', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

二 自适应阈值


       简单阈值是一种全局性的阈值,只需要设定一个阈值,整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,通过设定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点的情况。

      这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图都用一个阈值.
 

img = cv2.imread('4.jpg', 0)
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 第一个参数为原始图像矩阵,
# 第二个参数为像素值上限,
# 第三个是自适应方法(adaptive method):
# -----cv2.ADAPTIVE_THRESH_MEAN_C:领域内均值
# -----cv2.ADAPTIVE_THRESH_GAUSSIAN_C:领域内像素点加权和,权重为一个高斯窗口

# 第四个值的选择参数:只有cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV
# cv2.THRESH_BINARY(黑白二值)
# cv2.THRESH_BINARY_INV(黑白二值翻转)
# cv2.THRESH_TRUNC(得到额图像为多像素值)
# cv2.THRESH_TOZERO(当像素高于阈值时像素设置为自己提供的像素值,低于阈值时不作处理)
# cv2.THRESH_TOZERO_INV(当像素低于阈值时设置为自己提供的像素值,高于阈值时不作处理)


# 第五个Block size:设定领域大小(一个正方形的领域)
# 第六个参数C,阈值等于均值或者加权值减去这个常数(为0相当于阈值,就是求得领域内均值或者加权值)

th2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 2)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
th4 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow('img', img)
cv2.imshow('th1', th1)
cv2.imshow('th2', th2)
cv2.imshow('th3', th3)
cv2.imshow('th4', th4)
cv2.waitKey(0)
cv2.destroyAllWindows()

三 Otsu's二值化


           cv2.threshold( )函数有两个返回值,一个是阈值,第二个是处理后的图像矩阵。在cv2.threshold的方法参数中加上语句cv2.THRESH_OTSU, 非常适合于图像灰度直方图(只有灰度图像才有)具有双峰的情况在双峰之间找到一个值作为阈值,对于非双峰图像,可能并不是很好用

Otsu过程:

  1. 计算图像直方图;
  2. 设定一阈值,把直方图强度大于阈值的像素分成一组,把小于阈值的像素分成另外一组;
  3. 分别计算两组内的偏移数,并把偏移数相加;
  4. 把0~255依照顺序多为阈值,重复1-3的步骤,直到得到最小偏移数,其所对应的值即为结果阈值
img = cv2.imread('2.jpg', 0)
ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)  # 简单滤波
ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)  # Otsu 滤波
print(ret2)
cv2.imshow('img', img)
cv2.imshow('th1', th1)
cv2.imshow('th2', th2)
# 用于解决matplotlib中显示图像的中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.hist(img.ravel(), 256)
plt.title('灰度直方图')
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()

资料:

一文搞懂图像二值化算法

OpenCV图像处理(五)图像的阈值分割

OpenCV - 图像阈值(Python实现)


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

**星光*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值