opencv函数threshold、adaptiveThreshold、Otsu二值化的实现
threshold:固定阈值二值化,
ret,dst=cv2.threshold(src,thresh,maxval,type)
- src:输入图,只能输入单通道图像,通常来说为灰度图
- dst:输出图
- thresh:阈值
- maxval:当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
- type:二值化操作的类型,包含以下5种类型:cv2.THRESH_BINARY;cv2.THRESH_BINARY_INV;cv2.THRESH_TRUNC;cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
官方文档的示例代码:
importcv2
importnumpyasnp
frommatplotlibimportpyplotasplt
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=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
titles=['OriginalImage','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images=[img,thresh1,thresh2,thresh3,thresh4,thresh5]
foriinxrange(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
结果为:
adaptiveThreshold:自适应阈值二值化
自适应阈值二值化函数根据图片一小块区域的值来计算对应区域的阈值,从而得到也许更为合适的图片。
dst=cv2.adaptiveThreshold(src,maxval,thresh_type,type,BlockSize,C)
- src:输入图,只能输入单通道图像,通常来说为灰度图
- dst:输出图
- maxval:当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
- thresh_type:阈值的计算方法,包含以下2种类型:cv2.ADAPTIVE_THRESH_MEAN_C;cv2.ADAPTIVE_THRESH_GAUSSIAN_C.
- type:二值化操作的类型,与固定阈值函数相同,包含以下5种类型:cv2.THRESH_BINARY;cv2.THRESH_BINARY_INV;cv2.THRESH_TRUNC;cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV.
- BlockSize:图片中分块的大小
- C:阈值计算方法中的常数项
官方文档的示例代码:
importcv2
importnumpyasnp
frommatplotlibimportpyplotasplt
img=cv2.imread('sudoku.png',0)
img=cv2.medianBlur(img,5)
ret,th1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY,11,2)
th3=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2)
titles=['OriginalImage','GlobalThresholding(v=127)',
'AdaptiveMeanThresholding','AdaptiveGaussianThresholding']
images=[img,th1,th2,th3]
foriinxrange(4):
plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
结果为:
Otsu'sBinarization:基于直方图的二值化
Otsu'sBinarization是一种基于直方图的二值化方法,它需要和threshold函数配合使用。
Otsu过程:
1.计算图像直方图;
2.设定一阈值,把直方图强度大于阈值的像素分成一组,把小于阈值的像素分成另外一组;
3.分别计算两组内的偏移数,并把偏移数相加;
4.把0~255依照顺序多为阈值,重复1-3的步骤,直到得到最小偏移数,其所对应的值即为结果阈值。
官方文档的示例代码:
importcv2
importnumpyasnp
frommatplotlibimportpyplotasplt
img=cv2.imread('noisy2.png',0)
#globalthresholding
ret1,th1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
#Otsu'sthresholding
ret2,th2=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#Otsu'sthresholdingafterGaussianfiltering
blur=cv2.GaussianBlur(img,(5,5),0)
ret3,th3=cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#plotalltheimagesandtheirhistograms
images=[img,0,th1,
img,0,th2,
blur,0,th3]
titles=['OriginalNoisyImage','Histogram','GlobalThresholding(v=127)',
'OriginalNoisyImage','Histogram',"Otsu'sThresholding",
'GaussianfilteredImage','Histogram',"Otsu'sThresholding"]
foriinxrange(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]),plt.xticks([]),plt.yticks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]),plt.xticks([]),plt.yticks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]),plt.xticks([]),plt.yticks([])
plt.show()
结果为:
参考文献:http://docs.opencv.org/3.2.0/d7/d4d/tutorial_py_thresholding.html
到此这篇关于opencv函数threshold、adaptiveThreshold、Otsu二值化的实现的文章就介绍到这了,更多相关opencvthreshold、adaptiveThreshold、Otsu内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。