python-opencv函数总结之(一)threshold、adaptiveThreshold、Otsu 二值化

图像阈值处理技术
本文通过使用Python的OpenCV库实现不同类型的阈值处理技术,包括二值化、反二值化、截断等,并展示了如何通过Matplotlib可视化这些处理后的效果。
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 = 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 xrange(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

<think>我们正在处理图像二值化问题。根据引用[2][3],OpenCV-Python提供了cv.threshold函数进行图像二值化处理。 步骤: 1. 读取图像(如果是彩色图像,通常先转换为灰度图像) 2. 使用cv.threshold函数进行二值化 3. 显示或保存结果 函数说明: cv.threshold(src, thresh, maxval, type[, dst]) → retval, dst 参数: src: 输入图像(灰度图像) thresh: 阈值 maxval: 当像素值超过阈值(或低于阈值,根据type而定)时赋予的新值 type: 阈值处理类型,常见的有: cv.THRESH_BINARY: 大于阈值的部分取maxval,否则取0 cv.THRESH_BINARY_INV: 与上述相反 cv.THRESH_TRUNC: 大于阈值的部分取阈值,其余不变 cv.THRESH_TOZERO: 大于阈值的部分不变,否则取0 cv.THRESH_TOZERO_INV: 与上述相反 返回值: retval: 实际使用的阈值(在自适应阈值中会用到) dst: 二值化后的图像 另外,引用[3]提到还有自适应阈值(局部阈值)的方法:cv.adaptiveThreshold 自适应阈值函数: cv.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) → dst 参数: src: 输入灰度图像 maxValue: 满足条件的像素点将要设置的值 adaptiveMethod: 自适应方法,有两种: cv.ADAPTIVE_THRESH_MEAN_C: 邻域内均值 cv.ADAPTIVE_THRESH_GAUSSIAN_C: 邻域内高斯加权 thresholdType: 必须是cv.THRESH_BINARY或cv.THRESH_BINARY_INV blockSize: 邻域大小(奇数) C: 从计算的平均值或加权平均值中减去的常数 注意:自适应阈值不需要全局阈值,而是根据局部邻域计算阈值。 根据用户需求,他询问的是图像二值化处理方法,因此我们将介绍全局阈值自适应阈值两种方法。 下面给出代码示例:</think>### OpenCV-Python 图像二值化处理方法 图像二值化是将灰度图像转换为黑白图像的过程,OpenCV-Python 提供了两种主要方法: #### 、全局阈值法(`cv2.threshold`) 通过设定固定阈值进行二值化: ```python import cv2 # 读取图像并转换为灰度图 img = cv2.imread('input.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 全局阈值处理 ret, binary = cv2.threshold( gray, # 输入灰度图像 127, # 阈值(0-255) 255, # 最大值(二值化后白色值) cv2.THRESH_BINARY # 阈值类型 ) # 显示结果 cv2.imshow('Binary Image', binary) cv2.waitKey(0) ``` **常用阈值类型**: 1. `cv2.THRESH_BINARY`:大于阈值设为 maxval,否则为 0 $dst(x,y) = \begin{cases} maxval & \text{if } src(x,y) > thresh \\ 0 & \text{otherwise} \end{cases}$ 2. `cv2.THRESH_BINARY_INV`:反向二值化 3. `cv2.THRESH_TRUNC`:大于阈值设为阈值,否则不变 4. `cv2.THRESH_OTSU`:自动计算最优阈值(需与上述类型组合使用)[^3] **示例(Otsu 自动阈值)**: ```python ret, otsu_bin = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) ``` #### 二、自适应阈值法(`cv2.adaptiveThreshold`) 适用于光照不均的图像,局部计算阈值: ```python adaptive_bin = cv2.adaptiveThreshold( gray, 255, # 最大值 cv2.ADAPTIVE_THRESH_GAUSSIAN_C, # 自适应方法 cv2.THRESH_BINARY, # 阈值类型 11, # 邻域大小(奇数) 2 # 常数偏移量C ) ``` **自适应方法**: 1. `cv2.ADAPTIVE_THRESH_MEAN_C`:邻域均值 $T(x,y) = \mu_{neighborhood} - C$ 2. `cv2.ADAPTIVE_THRESH_GAUSSIAN_C`:邻域高斯加权 $T(x,y) = G_{\sigma} * I(x,y) - C$[^3] #### 选择建议: - **全局阈值**:图像光照均匀时使用(简单高效) - **自适应阈值**:光照不均或背景复杂时使用(计算量较大) - **Otsu算法**:直方图有双峰时自动确定阈值 > 注意:二值化前建议进行高斯模糊降噪: > ```python > blurred = cv2.GaussianBlur(gray, (5,5), 0) > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值