OpenCV-Python学习笔记4:图像阀值

摘要:
OpenCV提供了许多不同的阈值方法,这些方法由第四个参数决定。方法包括:cv2.THRESH_BINARYcv2.THRISH_BINARY_INVcv2.THISH_TRUNCcv2.THYSH_TOZEROcv2.THRESH_TOZEROV_INVimportcv2importnumpyasnpimportmatplotlibasmlp.usefrommatplotlibimportpyplotasplimig=cv2.imreadret,threshold1=cv2.thresholdret,thresh2=cv2.threshold3=cv2.tthresholdret,threshold5=cv2.thresholdtitles=['originalimage','Binary','Binary-inv','runc','tozero','ozero-inv']images=[img,threshold1,threshold2,threshold3,threshold4,threshold5]范围:plt.sublot,plt。内爆。标题。xticks([]),plt。催化([])树脂。显示()2。根据图像上的每个小区域计算自私响应阈值。因此,在同一图像的不同区域使用不同的阈值,这样我们可以在不同亮度的情况下获得更好的结果。Otsu的方法非常适合图像的灰度直方图有两个峰值的情况。他将找到两个峰值之间的值作为阈值。对于非双峰图像,它可能不是很有用。然后,Otsu获得的阈值是函数cv2.threshold的第一个参数。

参考:Opencv官方教程

1、简单阀值

cv2.threshold , cv2.adaptiveThreshold
当像素值高于阀值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色)。这个函数就是cv2.threshold()。这个函数的第一个参数就是原图像,原图像应该是灰度图。第二个参数就是用来对像素值进行分类的阀值,第三个参数就是当像素值高于(或者小于)阀值时,应该被赋予新的像素值。OpenCV提供了多种不同的阀值方法,这是有第四个参数来决定的。方法包括:
cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_TRUNC
cv2.THRESH_TOZERO
cv2.THRESH_TOZERO_INV

OpenCV-Python学习笔记4:图像阀值第1张

import cv2
import numpy as np
import matplotlib as mlp
mlp.use('TkAgg')
from matplotlib import pyplot as plt

img = cv2.imread('./opencv_learn/image2.jpg',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 = ['original image','Binary','binary-inv','trunc','tozero','tozero-inv']
images = [img,thresh1,thresh2,thresh3,thresh4,thresh5]

for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

plt.show()

  OpenCV-Python学习笔记4:图像阀值第2张

 2、自私应阀值

根据图像上的每一个小区域计算与其对应的阀值。因此在同一幅图像上的不同区域采用的是不同的阀值,从而使我们能在亮度不同的情况下得到更好的结果。
这种方法需要我们指定三个参数,返回值只有一个。
Adaptive Method 指定计算阀值的方法
-cv2.ADAPTIVE_THRESH_MEAN_C:阀值取自相邻区域的平均值
-cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阀值取自相邻区域的加权和,权重为一个高斯窗口
Block Size 邻域大小(用来计算阀值的区域大小)
C这就是一个常数,阀值就等于的平均值或者加权平均值减去这个常数

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('./opencv_learn/image2.jpg',0)
#中值滤波
img = cv2.medianBlur(img,5)

ret , th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# 11为block size,2为C值
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 = ['original image' , 'global thresholding (v=127)','Adaptive mean thresholding',
          'adaptive gaussian thresholding']
images = [img,th1,th2,th3]

for i in range(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

plt.show()

  OpenCV-Python学习笔记4:图像阀值第3张

3、Otsu`s二值化

我们前面说到,cv2.threshold函数是有两个返回值的,前面一直用的第二个返回值,也就是阈值处理后的图像,那么第一个返回值(得到图像的阈值)将会在这里用到。
前面对于阈值的处理上,我们选择的阈值都是127,那么实际情况下,怎么去选择这个127呢?有的图像可能阈值不是127得到的效果更好。那么这里我们需要算法自己去寻找到一个阈值,而Otsu’s就可以自己找到一个认为最好的阈值。并且Otsu’s非常适合于图像灰度直方图具有双峰的情况,他会在双峰之间找到一个值作为阈值,对于非双峰图像,可能并不是很好用。那么经过Otsu’s得到的那个阈值就是函数cv2.threshold的第一个参数了。因为Otsu’s方法会产生一个阈值,那么函数cv2.threshold的的第二个参数(设置阈值)就是0了,并且在cv2.threshold的方法参数中还得加上语句cv2.THRESH_OTSU。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('719100.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)
#(5,5)为高斯核的大小,0为标准差
blur= cv2.GaussianBlur(img,(5,5),0)

#阀值一定要设为0
ret3,th3=cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

images=[img,0,th1,
         img,0,th2,
         img,0,th3]
titles =['original noisy image','histogram','global thresholding(v=127)',
          'original noisy image','histogram',"otsu's thresholding",
          'gaussian giltered image','histogram',"otus's thresholding"]
#这里使用了pyplot中画直方图的方法,plt.hist要注意的是他的参数是一维数组
#所以这里使用了(numpy)ravel方法,将多维数组转换成一维,也可以使用flatten方法
for i in range(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()

 OpenCV-Python学习笔记4:图像阀值第4张

 

OpenCV-Python学习笔记4:图像阀值第5张

免责声明:文章转载自《OpenCV-Python学习笔记4:图像阀值》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数字签名(代码签名)流程Ubuntu18.04安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

验证码识别,发票编号识别

update:排版 这个demo的初衷不是去识别验证码,是把验证的图像处理方式用到其他方面,车票,票据等。 这里最后做了一个发票编号识别的的案例: 地址:http://v.youku.com/v_show/id_XMTI1MzUxNDY3Ng==.html 源代码:https://github.com/ccccccmd/ReCapcha demo中包含一个...

Android 9.0 获取CPU温度方法

HardwarePropertiesManager类提供访问设备硬件状态的机制:CPU,GPU和电池温度,每个内核的CPU使用率,风扇速度等。 API 说明:https://www.apiref.com/android-zh/android/os/HardwarePropertiesManager.html source code:  http://and...

AUC指标深度理解

AUC 指标 直观意义 AUC 指标用于评价分类器对于正、负样例的辨别能力,对出结果的排序位置(按照预测为正例的概率)敏感。 为什么提出这个指标? 一般来讲,精确率、召回率等指标,都需要设定一个阈值去判别是属于正类还是负类,例如预测分大于等于0.5判别为正类,小于0.5判别为负类。如何设定这个阈值,是个问题。而AUC这个指标则不需要设阈值。(或者说,每种...

服务熔断Hystrix的替换方案Sentinel

1 服务熔断Hystrix的替换方案 1.1 概述 2018年底Netflix公司宣布Hystrix已经足够稳定,不再积极开发Hystrix,该项目处于维护模式。就目前来看Hystrix是比较稳定的,并且Hystrix只是停止开发新的版本,并不是完全停止维护,Bug什么的依然会维护。因此,短期内,Hystrix依然是能继续使用的。但是从长远看,Hystri...

大数据技术之_19_Spark学习_08_Spark 机器学习_01_机器学习概述 + 机器学习的相关概念 + 算法常用指标

第1章 机器学习概述1.1 机器学习是啥?1.2 机器学习能干啥?1.3 机器学习有啥?1.4 机器学习怎么用?第2章 机器学习的相关概念2.1 数据集2.2 泛化能力2.3 过拟合和欠拟合2.4 维度、特征2.5 模型2.6 学习第3章 算法常用指标3.1 精确率和召回率3.2 TPR、FPR & TNR3.3 综合评价指标 F-measure...

halcon 模板匹配 -- create_shape_model

create_shape_model(Template: : //reduce_domain后的模板图像                         NumLevels,//金字塔的层数,可设为“auto”或0—10的整数                      AngleStart,//模板旋转的起始角度                      ...