时间:2021-05-22
简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
普通图像二值化
代码如下:
import cv2 as cvimport numpy as np#全局阈值def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割。 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE) print("threshold value %s"%ret) cv.namedWindow("binary0", cv.WINDOW_NORMAL) cv.imshow("binary0", binary)#局部阈值def local_threshold(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 #自适应阈值化能够根据图像不同区域亮度分布,改变阈值 binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY, 25, 10) cv.namedWindow("binary1", cv.WINDOW_NORMAL) cv.imshow("binary1", binary)#用户自己计算阈值def custom_threshold(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 h, w =gray.shape[:2] m = np.reshape(gray, [1,w*h]) mean = m.sum()/(w*h) print("mean:",mean) ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY) cv.namedWindow("binary2", cv.WINDOW_NORMAL) cv.imshow("binary2", binary)src = cv.imread('E:/imageload/kobe.jpg')cv.namedWindow('input_image', cv.WINDOW_NORMAL) #设置为WINDOW_NORMAL可以任意缩放cv.imshow('input_image', src)threshold_demo(src)local_threshold(src)custom_threshold(src)cv.waitKey(0)cv.destroyAllWindows()运行结果:
注意:
1.全局阈值
①OpenC的threshold函数进行全局阈值。其函数原型为:threshold(src, thresh, maxval, type[, dst]) -> retval, dst
src参数表示输入图像(多通道,8位或32位浮点)。
thresh参数表示阈值。
maxval参数表示与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。
type参数表示阈值类型。
retval参数表示返回的阈值。若是全局固定阈值算法,则返回thresh参数值。若是全局自适应阈值算法,则返回自适应计算得出的合适阈值。
dst参数表示输出与src相同大小和类型以及相同通道数的图像。
②type参数阈值类型这部分参考博客:https://blog.csdn.net/iracer/article/details/49232703 ,写的很不错。
阈值类型:
阈值类型图示:
③type参数单独选择上述五种阈值类型时,是固定阈值算法,效果比较差。
此外还有自适应阈值算法:(自适应计算合适的阈值,而不是固定阈值)
比如结合cv.THRESH_OTSU,写成cv.THRESH_BINARY | cv.THRESH_OTSU。例子:ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #大律法,全局自适应阈值,第二个参数值0可改为任意数字但不起作用。
比如结合cv.THRESH_TRIANGLE,写成cv.THRESH_BINARY | cv.THRESH_TRIANGLE。例子:ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE) #TRIANGLE法,全局自适应阈值,第二个参数值0可改为任意数字但不起作用,适用于单个波峰。
补:
cv.THRESH_OTSU和cv.THRESH_TRIANGLE也可单独使用,不一定要写成和固定阈值算法结合的形式。单独写和结合起来写,都是自适应阈值算法优先。
例子:ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_OTSU)#大律法 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_TRIANGLE)#TRIANGLE法
2.局部阈值
OpenCV的adaptiveThreshold函数进行局部阈值。函数原型为:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
src参数表示输入图像(8位单通道图像)。
maxValue参数表示使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.
adaptiveMethod参数表示自适应阈值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)。
thresholdType参数表示阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型。
blockSize参数表示块大小(奇数且大于1,比如3,5,7........ )。
C参数是常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值。
补:在使用平均和高斯两种算法情况下,通过计算每个像素周围blockSizex blockSize大小像素块的加权均值并减去常量C即可得到自适应阈值。如果使用平均的方法,则所有像素周围的权值相同;如果使用高斯的方法,则每个像素周围像素的权值则根据其到中心点的距离通过高斯方程得到。
参考:https://blog.csdn.net/guduruyu/article/details/68059450
3.numpy的reshape函数是给数组一个新的形状而不改变其数据,函数原型:reshape(a, newshape, order='C')
a参数表示需要重新形成的原始数组。
newshape参数表示int或int类型元组(tuple),若为(1, 3),表示生成的新数组是1行3列。
order参数表表示使用此索引顺序读取a的元素,并使用此索引顺序将元素放置到重新形成的数组中。
函数返回值:如果可能的话,这将是一个新的视图对象; 否则,它会成为副本。
以上就是Python+OpenCV图像处理——图像二值化的实现的详细内容,更多关于python 图像二值化的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
python+OpenCV图像礼帽图像礼帽也叫图像顶帽礼帽图像=原始图像-开运算图像得到噪声图像开运算:先腐蚀再膨胀使用对象:二值图像使用方法:morpholo
本文实例为大家分享了利用python和OpenCV实现图像拼接,供大家参考,具体内容如下python+OpenCV实现imagestitching在最新的Ope
语言:python+opencv为什么使用图像腐蚀和图像膨胀如图,使用图像腐蚀进行去噪,但是为压缩噪声。对腐蚀过的图像,进行膨胀处理,可以去除噪声,并保持原样形
利用Python+opencv实现从摄像头捕获图像,识别其中的人眼/人脸,并打上马赛克。系统环境:Windows7+Python3.6.3+opencv3.4.
本文实例讲述了Python图像处理之简单画板实现方法。分享给大家供大家参考,具体如下:Python图像处理也是依赖opencv的Python接口实现的,Pyth