- OpenCV Python 教程
- OpenCV Python - 主页
- OpenCV Python - 概述
- OpenCV Python - 环境
- OpenCV Python - 读取图像
- OpenCV Python - 写入图像
- OpenCV Python - 使用 Matplotlib
- OpenCV Python - 图像属性
- OpenCV Python - 位运算
- OpenCV Python - 形状和文本
- OpenCV Python - 鼠标事件
- OpenCV Python - 添加轨迹栏
- OpenCV Python - 调整大小和旋转
- OpenCV Python - 图像阈值
- OpenCV Python - 图像过滤
- OpenCV Python - 边缘检测
- OpenCV Python - 直方图
- OpenCV Python - 颜色空间
- OpenCV Python - 转换
- OpenCV Python - 图像轮廓
- OpenCV Python - 模板匹配
- OpenCV Python - 图像Pyramid
- OpenCV Python - 图像相加
- OpenCV Python - 图像混合
- OpenCV Python - 傅里叶变换
- OpenCV Python - 捕获视频
- OpenCV Python - 播放视频
- OpenCV Python - 视频图像
- OpenCV Python - 来自图像的视频
- OpenCV Python - 人脸检测
- OpenCV Python - Meanshift/Camshift
- OpenCV Python - 特征检测
- OpenCV Python - 特征匹配
- OpenCV Python - 数字识别
- OpenCV Python 资源
- OpenCV Python - 快速指南
- OpenCV Python - 资源
- OpenCV Python - 讨论
OpenCV Python - 图像阈值
在数字图像处理中,阈值处理是基于像素强度阈值创建二值图像的过程。阈值处理将前景像素与背景像素分开。
OpenCV 提供了执行简单、自适应和Otsu阈值的函数。
在简单阈值处理中,所有值小于阈值的像素都设置为零,其余为最大像素值。这是最简单的阈值形式。
cv2.threshold ()函数具有以下定义。
cv2.threshold((src, thresh, maxval, type, dst)
参数
图像阈值处理的参数如下 -
- Src:输入数组。
- Dst:相同大小的输出数组。
- 阈值:阈值。
- Maxval:最大值。
- 类型:阈值类型。
阈值类型
其他类型的阈值列举如下 -
先生编号 | 类型与功能 |
---|---|
1 | CV.THRESH_BINARY dst(x,y) = maxval 如果 src(x,y)>thresh 0 否则 |
2 | CV.THRESH_BINARY_INV dst(x,y)=0 如果 src(x,y)>thresh maxval 否则 |
3 | CV.THRESH_TRUNC dst(x,y)=阈值 如果 src(x,y)>阈值 src(x,y) 否则 |
4 | CV.THRESH_TOZERO dst(x,y)=src(x,y) 如果 src(x,y)>thresh 0 否则 |
5 | CV.THRESH_TOZERO_INV dst(x,y)=0 如果 src(x,y)> 阈值 src(x,y) 否则 |
这些阈值类型根据下图对输入图像进行操作 -
Threshold() 函数返回使用的阈值和阈值图像。
以下程序通过将阈值设置为 127,从原始图像生成灰度值从 255 到 0 的梯度的二值图像。
例子
使用 Matplotlib 库并排绘制原始阈值二值图像和生成的阈值二值图像。
import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('gradient.png',0) ret,img1 = cv.threshold(img,127,255,cv.THRESH_BINARY) plt.subplot(2,3,1),plt.imshow(img,'gray',vmin=0,vmax=255) plt.title('Original') plt.subplot(2,3,2),plt.imshow(img1,'gray',vmin=0,vmax=255) plt.title('Binary') plt.show()
输出
自适应阈值根据像素周围的小区域确定像素的阈值。因此,同一图像的不同区域获得不同的阈值。这可以为具有不同照明的图像提供更好的结果。
cv2.adaptiveThreshold() 方法采用以下输入参数 -
cv.adaptiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst] )
AdaptiveMethod 有以下枚举值 -
cv.ADAPTIVE_THRESH_MEAN_C - 阈值是邻域区域的平均值减去常数 C。
cv.ADAPTIVE_THRESH_GAUSSIAN_C - 阈值是邻域值的高斯加权和减去常数 C。
例子
在下面的示例中,原始图像(messi.jpg)应用了均值和高斯自适应阈值。
import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('messi.jpg',0) img = cv.medianBlur(img,5) th1 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,\ cv.THRESH_BINARY,11,2) th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\ cv.THRESH_BINARY,11,2) titles = ['Original', 'Mean Thresholding', 'Gaussian Thresholding'] images = [img, th1, th2] for i in range(3): plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
输出
使用 matplotlib 绘制原始和自适应阈值二进制图像,如下所示 -
例子
OTSU 算法根据图像直方图自动确定阈值。除了 THRESH-BINARY 标志之外,我们还需要传递 cv.THRES_OTSU 标志。
import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('messi.jpg',0) # global thresholding ret1,img1 = cv.threshold(img,127,255,cv.THRESH_BINARY) # Otsu's thresholding ret2,img2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU) plt.subplot(2,2,1),plt.imshow(img,'gray',vmin=0,vmax=255) plt.title('Original') plt.subplot(2,2,2),plt.imshow(img1,'gray') plt.title('Binary') plt.subplot(2,2,3),plt.imshow(img2,'gray') plt.title('OTSU') plt.show()
输出
matplotlib 的绘图结果如下 -