opencv二值化详解

6 篇文章 0 订阅
1 篇文章 0 订阅

二值化

学习了二值化,我通过看了很多资料,希望通过总结和大家一起学习,一起努力,有错误,希望大家指正

在处理图片操作时,二值化在图片领域占有很大作用
在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓
opencv中,提供了多种二值化方法

以8位图为例(即值为0-255)

方法one: cv2.THRESH_BINARY像素灰度值小于阈值全为0,大于阈值全为255
方法two: cv2.THRESH_BINARY_INV像素灰度值小于阈值全为255,大于阈值全为0
方法tree: cv2.THRESH_TRUNC像素灰度值小于阈值不变,大于阈值变为阈值
方法four: cv2.THRESH_TOZERO像素灰度值小于阈值不做任何改变,大于阈值全为0
方法five: cv2.THRESH_TOZERO_INV像素灰度值小于阈值全为0,大于阈值不做任何改变

公式如下
在这里插入图片描述

二值化方法
cv2.threshold(src, thresh, maxval, type)
src: 图片源
thresh: 阈值
maxval: 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
type: 表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BINARY)

OTSU算法
一般,我们不知道用什么阈值可以获得更好的二值化图像.OTSU会通过一系列计算,计算出,比较优的阈值(可以理解为,在
图像直方图中,如果存在两峰,那么,我们的阈值应该尽可能的在两峰之间的峰谷).因此,对于非双峰图,用这种方法可能效果
不太理想

OTSU是计算二值化的算法,计算二值化的算法有很多,一般使用OTSU

下面使用OTSU算法实现THRESH_BINARY二值化

import cv2 as cv
path=''
image=cv.imread(path)
image=cv.cvtColor(image,cv.COLOR_RGB2GRAY)
ret,binary=cv.threshold(image,0,255,cv.THRESH_BINARY + cv.THRESH_OTSU)
print('峰值为:',ret)  # ret为OTSU算法得出的阈值
cv.imshow('THRESH_BINRY',binary)
cv.waitKey(0)
cv.destroyAllWindows()

下面不适应OTSU算法实现THRESH_TRUNC

import cv2 as cv
path=''
image=cv.imread(path)
image=cv.cvtColor(image,cv.COLOR_RGB2GRAY)
ret,binary=cv.threshold(image,127,255,cv.THRESH_TRUNC) # 这里指定127为阈值
print('峰值为:',ret)  # ret为阈值
cv.imshow('THRESH_BINRY',binary)
cv.waitKey(0)
cv.destroyAllWindows()

以上为全局二值化,下面介绍一下,局部二值化

局部二值化方法
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
src: 图像源
maxValue: 灰度像素值上限,举例为8位图(255)
adaptiveMethod: 自适应算法:两种{1:cv2.ADAPTIVE_THRESH_MEAN_C 采用领域内均值2:cv2.ADAPTIVE_THRESH_GAUSSIAN_C 采用领域内像素加权和,权重为高斯窗口}
thresholdType: 为二值化算法,只适用于(cv2.THRESH_BINARY and cv2.THRESH_BINARY_INV)
blockSize: 领域大小,为正方形
C: 阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)
这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图像都用一个阈值。

imprt cv2 as cv
path=''
image=cv.imread(path)
image=cv.cvtColor(image,cv.COLOR_RGB2GRAY)
binary=cv.adaptiveThreshold(image,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2)
cv.imshow('ADAPTIVE_THRESH_MEAN_C',binary)
cv.waitKey(0)
cv2.destroyAllWindows()

以上是我学习二值化后的一些总结,不好之处,欢迎评论,一起学习

  • 15
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值