(openCV 十七)图像阈值、二值化

本文详细介绍了OpenCV中的图像阈值处理,包括简单阈值、自适应阈值和Otsu's二值化的原理与应用,并通过代码示例展示了如何实现各种阈值操作。此外,还提及了`cv2.inRange()`函数在二值化图像中的作用。
摘要由CSDN通过智能技术生成

1、简单阈值
与名字一样,这种方法非常简单。但像素值高于阈值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色)。这个函数就是 cv2.threshhold()
第一个参数:就是原图像,原图像应该是灰度图。
第二个参数:就是用来对像素值进行分类的阈值。
第三个参数:就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值。
第四个参数:OpenCV提供了多种不同的阈值方法,这是有第四个参数来决定的。这些方法包括:
• cv2.THRESH_BINARY
• cv2.THRESH_BINARY_INV
• cv2.THRESH_TRUNC
• cv2.THRESH_TOZERO
• cv2.THRESH_TOZERO_INV
在这里插入图片描述
返回值:第一个为 retVal,我们后面会解释。第二个就是阈值化之后的结果图像了。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread(‘gradient.png’,0)
ret,thresh1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3

图像二值化(需要是灰度图像) import cv2 as cv import numpy as np def threshold_demo(image): gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #cv.THRESH_TRIANGLE与cv.THRESH_OTSU是自动寻找阈值,这个时候threshold值必须是0 #如果threshold不为0,即是自己指定的(如127),那么type就直接THRESH_BINARY就够了 ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) print(ret) cv.imshow("binary",binary) def local_threshold(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) binary =cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10) cv.imshow("binary1", binary) src =cv.imread("E:/opencv/picture/dog.jpg") cv.imshow("initial_window",src) threshold_demo(src) local_threshold(src) cv.waitKey(0) cv.destroyAllWindows() 分析: 1. 全局阈值 def threshold_demo(image): gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #cv.THRESH_TRIANGLE与cv.THRESH_OTSU是自动寻找阈值,这个时候threshold值必须是0 #如果threshold不为0,即是自己指定的(如127),那么type就直接THRESH_BINARY就够了 ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) print(ret) cv.imshow("binary",binary) threshold其函数原型为:threshold(src, thresh, maxval, type[, dst]) -> retval, dst src参数表示输入图像(多通道,8位或32位浮点)。 thresh参数表示阈值。(如果type是自动二值化就设置为0) maxval参数表示与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。 type参数表示阈值类型。 retval参数表示返回的阈值。若是全局固定阈值算法,则返回thresh参数值。若是全局自适应阈值算法,则返回自适应计算得出的合适阈值。 dst参数表示输出与src相同大小和类型以及相同通道数的图像。 type阈值类型说明 cv.THRESH_BINARY | cv.THRESH_OTSU)#大律法,全局自适应阈值 参数0可改为任意数字但不起作用 cv.THRESH_BINARY | cv.THRESH_TRIANGLE)#TRIANGLE法,,全局自适应阈值, 参数0可改为任意数字但不起作用,适用于单个波峰 cv.THRESH_BINARY)# 自定义阈值为127,大于127的是白色 小于的是黑色 cv.THRESH_BINARY_INV)# 自定义阈值为127,大于127的是黑色 小于的是白色 cv.THRESH_TRUNC)# 截断 大于127的是改为127 小于127的保留 cv.THRESH_TOZERO)# 截断 小于127的是改为127 大于127的保留 2. 局部阈值法 3. def local_threshold(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) binary =cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10) cv.imshow("binary1", binary) adaptiveThreshold函数进行局部阈值 函数原型为:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst src参数表示输入图像(8位单通道图像)。 maxValue参数表示使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值. adaptiveMethod参数表示自适应阈值算法, 平均— cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值 高斯—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权 重为一个高斯窗口 thresholdType参数表示阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型。 blockSize参数表示块大小,规定领域大小(奇数且大于1,比如3,5,7........ )。 C参数是常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值。 二.对超大图像进行二值化 如果这个时候只是单纯的用二值化api,图像上会出现很多噪声,所以我们特地介绍了一种对大图像进行二值化的方法import cv2 as cv import numpy as np from matplotlib import pyplot as plt #对超大图像进行二值化 def big_image_threshold(image): cw = 256 ch = 256 h,w = image.shape[:2] gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) for row in range(0, h, ch): for col in range(0, w, cw): #gray[0:3] 从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。 roi = gray[row:row+ch,col:col+ch]#表示从[row,col]到[row+ch,col+ch]的所有元素所组成的矩阵 #推荐使用局部阈值二值化 dst = cv.adaptiveThreshold(roi,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,127,20) gray[row:row+ch,col:col+ch] =dst cv.imwrite("E:/opencv/picture/bigpicture1.jpg",gray) src = cv.imread("E:/opencv/picture/bigpicture.jpg") t1 = cv.getTickCount() big_image_threshold(src) t2 = cv.getTickCount() time= (t2-t1)/cv.getTickFrequency() #print("time =%sms\n"%(time)*1000) cv.waitKey(0) cv.destroyAllWindows()
交通标志识别系统标准完全模板HSV定位基础版-二值化模板.rar 本帖最后由 hcq@@ 于 2013-7-7 11:04 编辑 1、交通标志(警示牌类),其外框一般为红色,所以定位时可采用HSV颜色模型或者RGB颜色模型来提取红色区域,通过regiongroup标记进一步提取目标区域。 HSV颜色模型:I1=Hsv; %记录颜色亮度为1的数据,以便之后再利用颜色阀值找出红色 figure,imshow;title'); BW=roicolor; %利用颜色阀值将红色对象都都显示为白色,其余都为黑色,至此完成图象的二值化 figure,imshow;title; 复制代码具体参考附件HSV提取基础版.rar RGB颜色模型 IR=double; IG=double; IB=double; for i=1:chang for j=1:kuan if 1.6*IR-IG-IB255 CA=255; else CA=1.6*IR-IG-IB; end end end figure;imshow;title; 复制代码经过对比,对于目标边界清晰的图片,RGB颜色模型的效果很不错,结果在贴图中。 2、分割出来的交通标志,为了便于二值化处理,强烈建议将背景黑色转成白色,这里标准模板只处理了20几张(考虑到可能用不到这么多的模板),如果有需要,可采取灰度—二值化—反色—擦除边缘—归一化步骤,即可处理成新的模板。代码在 附件里面: 3、识别的时候,可先建立数组,和普通的识别方法一样的,识别结果可采取msgbox的显示方法(即根据返回的匹配索引,得出结果)。if x==1 msgbox;end if x==2 msgbox;end if x==3 msgbox;end if x==4 msgbox;end 。。。。。。。同理 复制代码
OpenCV中,图像阈值二值化是一种基本的图像处理操作,可以将图像转换为二值图像OpenCV提供了两种常用的图像阈值二值化方法:全局阈值二值化和自适应阈值二值化。全局阈值二值化是指将整个图像分割为黑白两个部分,而自适应阈值二值化是指根据图像的局部区域来确定阈值,从而得到更精确的二值化结果。 在OpenCV中,全局阈值二值化操作的C API如下: double cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type) 其中,src表示输入图像,dst表示输出的二值化图像,thresh表示设定的阈值,maxval表示阈值以上的像素值,type表示二值化的类型。 另外,OpenCV还提供了一些其他的阈值操作方法。自适应阈值二值化是其中之一,其API如下: void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C) 其中,src表示输入图像,dst表示输出的二值化图像,maxValue表示阈值以上的像素值,adaptiveMethod表示自适应阈值的计算方法,thresholdType表示二值化的类型,blockSize表示局部阈值计算的邻域大小,C表示从计算得到的阈值中减去的常数。 总结起来,OpenCV提供了多种图像阈值二值化方法,可以根据具体需求选择合适的方法进行二值化操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [二值图像分析:OpenCV中的二值化阈值操作](https://blog.csdn.net/PecoHe/article/details/113876296)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [【OpenCv阈值操作(超详细)](https://blog.csdn.net/qq_49838656/article/details/119516784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值