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

本文介绍了三种图像二值化方法:固定阈值二值化、自适应阈值二值化及Otsu's Binarization。详细解释了每种方法的工作原理、参数设置及应用场景,并提供了丰富的代码示例。

作为一个懒癌晚期患者,一遍遍翻官方文档真是种折磨,遂将写小程序时碰到的一些不熟悉的函数及其用法记录下来。可能没有什么条理性,因为是记录的是在写得时候随机遇到自己不大熟悉的函数,见谅。

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

官方文档的示例代码:

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()

结果为:

adaptiveThreshold:自适应阈值二值化

自适应阈值二值化函数根据图片一小块区域的值来计算对应区域的阈值,从而得到也许更为合适的图片。

dst = cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, 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.
  • Block Size: 图片中分块的大小
  • C :阈值计算方法中的常数项

官方文档的示例代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
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 = ['Original Image', 'Global Thresholding (v = 127)',
            'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in xrange(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

结果为:

Otsu’s Binarization: 基于直方图的二值化

Otsu’s Binarization是一种基于直方图的二值化方法,它需要和threshold函数配合使用。

Otsu过程:
1. 计算图像直方图;
2. 设定一阈值,把直方图强度大于阈值的像素分成一组,把小于阈值的像素分成另外一组;
3. 分别计算两组内的偏移数,并把偏移数相加;
4. 把0~255依照顺序多为阈值,重复1-3的步骤,直到得到最小偏移数,其所对应的值即为结果阈值。

官方文档的示例代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('noisy2.png',0)
# global thresholding
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# Otsu's thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# plot all the images and their histograms
images = [img, 0, th1,
          img, 0, th2,
          blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
          'Original Noisy Image','Histogram',"Otsu's Thresholding",
          'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in xrange(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

<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) > ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值