[OpenCv](python)图像二值化

本文详细介绍图像二值化的两种主要方法:全局阈值和局部阈值。通过使用Python的OpenCV库,演示了如何应用不同的阈值技术,如二进制阈值化、反二进制阈值化等,来优化图像处理效果。

图像二值化

import cv2 as cv
import numpy as np

“”"

1、 全局阈值函数

cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst

参数: src - 输入数组/图像(多通道,8位或32位浮点)

thresh - 阈值

maxval - 最大值,与#THRESH_BINARY和#THRESH_BINARY_INV阈值类型一起使用的最大值(maximum value)

type - 阈值类型

dst - 输出数组/图像(与src相同大小和类型以及相同通道数的数组/图像)。

此外,特殊值#THRESH_OTSU或#THRESH_TRIANGLE可以与上述值之一组合。 在这些情况下,函数使用Otsu或Triangle算法确定最佳阈值,并使用它而不是指定的阈值。

返回值:retval - 阈值 thresh

          dst - 经函数处理后的图像 image

“”"

#全局阈值
def threshold_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    # 单个波峰(医学影像)用cv.THRESH_TRIANGLE),多个波峰用cv.THRESH_OTSU
    ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY|cv.THRESH_OTSU)
    print("threshold value %s"%ret)
    cv.imshow("binary", binary)

“”"

2、局部阈值函数

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst

参数:src-输入图像(8位单通道图像)

maxValue-使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.

adaptiveMethod-自适应阈值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)

thresholdType-阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型

blockSize-块大小(奇数且大于1 )

C-常数,从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值

返回值:dst-经函数处理过的图像
“”"

#局部阈值
def local_threshold(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    #平均数大于10才变成白色,去除噪声
    binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
    cv.imshow("binary", binary)
#自适应阈值
def custom_threshold(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    # 求出宽高
    h, w = gray.shape[:2]
    # 变成一维数组
    m = np.reshape(gray, [1, w*h])
    mean = m.sum() / (w*h)
    print("mean : ", mean)
    ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
    cv.imshow("binary", binary)


print("--------- Python OpenCV Tutorial ---------")
src = cv.imread("D:/vcprojects/images/test.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
custom_threshold(src)
cv.waitKey(0)

cv.destroyAllWindows()

阈值类型:

1)二进制阈值化 THRESH_BINARY
2) 反二进制阈值化THRESH_BINARY_INV
3)截断阈值化 THRESH_TRUNC
4) 阈值化为0 THRESH_TOZERO
5) 反阈值化为0 THRESH_TOZERO_INV
在这里插入图片描述

全局阈值结果:

在这里插入图片描述

局部阈值结果:

在这里插入图片描述

图像二值化是将灰度图像转换为只有黑白两种像素值的图像(0 和 255),然后通过**取反操作**可以将原来的黑色变为白色,白色变为黑色。这在 OCR、文字识别、轮廓提取等任务中非常有用。 --- ### ✅ 实现步骤 1. **读取图像**(支持含中文/泰文路径) 2. **转为灰度图** 3. **二值化处理**(使用 `cv2.threshold` 或自适应阈值) 4. **取反颜色**(使用 `cv2.bitwise_not`) 5. **显示或保存结果** --- ### ✅ 完整 Python 代码如下: ```python import cv2 import numpy as np def imread_unicode(image_path): """安全读取含中文/泰文路径的图像""" try: with open(image_path, 'rb') as f: data = f.read() np_buffer = np.frombuffer(data, dtype=np.uint8) img = cv2.imdecode(np_buffer, cv2.IMREAD_COLOR) return img except Exception as e: print(f"读取失败 {image_path}: {e}") return None def imwrite_unicode(image_path, img): """保存图像到可能含中文/泰文的路径""" try: success, encoded_image = cv2.imencode(".png", img) if success: with open(image_path, 'wb') as f: encoded_image.tofile(f) return True else: print(f"编码失败: {image_path}") return False except Exception as e: print(f"保存失败 {image_path}: {e}") return False def binary_and_invert(image_path, output_path=None): """ 对图像进行二值化 + 取反操作 :param image_path: 输入图像路径(可含中文) :param output_path: 输出路径(可选) :return: 二值取反后的图像 """ # 1. 读取图像(支持非ASCII路径) img = imread_unicode(image_path) if img is None: raise ValueError(f"无法读取图像: {image_path}") # 2. 转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 3. 二值化:使用固定阈值(可改为自适应) # 大于127设为255(白),否则为0(黑) _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 4. 取反:黑变白,白变黑 inverted = cv2.bitwise_not(binary) # 5. 显示结果 cv2.imshow("Original", img) cv2.imshow("Binary (Black & White)", binary) cv2.imshow("Inverted (Black <-> White)", inverted) cv2.waitKey(0) cv2.destroyAllWindows() # 6. 保存结果(如果指定了输出路径) if output_path: imwrite_unicode(output_path, inverted) print(f"已保存取反二值化图像至: {output_path}") return inverted # ===================== 使用示例 ===================== if __name__ == '__main__': input_path = r'E:\LPR\ภาพไทย\test.jpg' # 替换为你自己的图像路径(可含泰文) output_path = r'E:\LPR\ภาพไทย\result_inverted.png' result = binary_and_invert(input_path, output_path) ``` --- ### ✅ 关键函数解释 | 函数 | 作用 | |------|------| | `cv2.cvtColor(..., cv2.COLOR_BGR2GRAY)` | 彩色图 → 灰度图 | | `cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)` | 二值化:>127 → 白(255),≤127 → 黑(0) | | `cv2.bitwise_not(binary)` | 按位取反:0→255,255→0(实现黑白反转) | --- ### ✅ 可选改进:使用自适应阈值(推荐用于光照不均) 如果你的图像光照不均匀,建议使用: ```python binary = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2 ) ``` 然后再 `bitwise_not` 取反。 --- ### ✅ 示例效果 | 原图 | 二值化后 | 取反后 | |------|---------|--------| | 彩色或灰度照片 | 文字白底黑字 → 黑底白字 | 黑底白字 → 白底黑字 | | —— | 黑=0, 白=255 | 黑=255, 白=0 | > ⚠️ 注意:最终图像为单通道(`CV_8UC1`),每个像素是 0 或 255。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值