首页 > 编程语言 >opencv-python库 cv2图像二值化详解

opencv-python库 cv2图像二值化详解

时间:2024-04-04 22:04:50浏览次数:35  
标签:阈值 python cv2 opencv thresh 图像 THRESH 二值化

文章目录

图像二值化原理

图像二值化原理是通过设定一个阈值,将图像中的像素点的灰度值与阈值进行比较,大于阈值的像素点设置为白色,小于阈值的像素点设置为黑色
1。图像二值化是将彩色或灰度图像转换为只包含两种颜色(通常是黑色和白色)的二值图像的过程1。

图像二值化通常分为自适应二值化、定阈二值化、OTSU算法等。定阈二值化是用户把整幅图像上的每个像素点的灰度值设定为某一阈值,当灰度值大于该阈值时,其灰度值被视为"1",如果小于该阈值,其灰度值被视为"0",从而实现了图像二值化2。

cv2.threshold()

cv2.threshold 是 OpenCV(一个开源的计算机视觉库)中的一个函数,用于对图像进行阈值处理,也就是将图像转换为二值图像。这个函数特别适用于那些需要明确区分前景和背景的情况,例如,当你想要检测图像中的某个物体时。
函数原型

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

参数说明

  • src:输入图像,通常是一个灰度图像。阈值处理通常在灰度图像上进行,因为灰度图像只有一个通道,处理起来比较简单。
  • thresh:阈值。这是一个用于分类像素值的参数。所有小于 thresh 的像素值都会被赋予一个新的值(通常是 0),而所有大于或等于 thresh 的像素值都会被赋予另一个值(通常是 maxval)。
  • maxval:当像素值超过阈值时,所赋予的值。在二值化的情况下,这通常是 255(白色)。
  • type:阈值类型,决定了如何处理像素值与阈值之间的关系。OpenCV 提供了多种阈值类型,如:
    • cv2.THRESH_BINARY:二值化阈值化。所有大于 thresh 的像素值设为 maxval,小于等于 thresh 的像素值设为 0。
    • cv2.THRESH_BINARY_INV:反二值化阈值化。所有大于 thresh 的像素值设为 0,小于等于 thresh 的像素值设为 maxval。
    • cv2.THRESH_TRUNC:截断阈值化。所有大于 thresh 的像素值设为 thresh,小于等于 thresh 的像素值不变。
    • cv2.THRESH_TOZERO:阈值化为 0。所有大于 thresh 的像素值不变,小于等于 thresh 的像素值设为 0。
    • cv2.THRESH_TOZERO_INV:反阈值化为 0。所有大于 thresh 的像素值设为 0,小于等于 thresh 的像素值不变。
  • dst:输出图像,是一个可选参数。如果提供了这个参数,函数会将结果存储在这个图像中,而不是创建一个新的图像。

使用示例

import cv2

# 读取图像并转换为灰度图像
image = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)

# 应用阈值处理
ret, thresholded_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

# 显示原始图像和阈值化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Thresholded Image', thresholded_image)

# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们读取了一个图像,将其转换为灰度图像,然后应用了二值化阈值处理。ret 变量存储了使用的阈值,而 thresholded_image 是阈值处理后的图像。最后,我们显示了原始图像和阈值化后的图像。

Qtsu二值化

在OpenCV中,cv2.threshold 函数用于对图像进行阈值处理。当您使用 cv2.THRESH_BINARY 与 cv2.THRESH_OTSU 结合时(使用位运算符 | 来组合它们),这意味着您想使用大津算法(Otsu’s method)来自动计算一个最优阈值,并将图像二值化。
使用 | 符号来组合 cv2.THRESH_BINARY 和 cv2.THRESH_OTSU 意味着您希望同时应用这两种操作:二值化图像并使用Otsu’s 方法计算阈值。

下面是一个Python代码示例,展示了如何使用 cv2.threshold 函数和Otsu’s 方法:

import cv2

# 读取图像并转换为灰度图像
gray_img = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)

# 使用Otsu's 方法计算阈值并进行二值化
ret, thresh_img = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

# ret变量现在包含由Otsu's 方法计算出的最优阈值
# thresh_img是应用了这个阈值后的二值化图像

# 显示原始图像和二值化后的图像
cv2.imshow('Original Image', gray_img)
cv2.imshow('Thresholded Image', thresh_img)

# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,ret 变量将包含由Otsu’s 方法计算出的最优阈值,而 thresh_img 是应用了这个阈值后的二值化图像。这种方法在处理光照不均或具有不同对比度的图像时特别有用,因为它可以自动适应图像内容来确定最佳阈值。

cv2.adaptiveThreshold

cv2.adaptiveThreshold 是 OpenCV 中的一个图像处理函数,用于对灰度图像进行自适应阈值处理。与全局阈值处理不同,自适应阈值处理根据图像的局部区域来确定阈值,因此可以有效地处理光照不均匀的图像1。

以下是 cv2.adaptiveThreshold 的详细用法和参数说明:
函数原型

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

参数说明

  • src:输入图像,应为灰度图像。
  • maxValue:当像素值超过(或小于,取决于阈值类型)计算出的阈值时,所赋予的值。通常设置为 255,表示白色。
  • adaptiveMethod:自适应方法,决定如何计算阈值。常用的有 cv2.ADAPTIVE_THRESH_MEAN_C(邻域内像素的平均值)和 cv2.ADAPTIVE_THRESH_GAUSSIAN_C(邻域内像素的高斯加权和)。
  • thresholdType:阈值类型,决定如何应用阈值。常用的有 cv2.THRESH_BINARY(二值化)和 cv2.THRESH_BINARY_INV(反二值化)。
  • blockSize:计算阈值时要考虑的邻域大小(像素数量)。这个值必须是奇数。
  • C:从计算出的阈值中减去的常数。

使用示例

import cv2

# 读取图像并转换为灰度图像
gray_img = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)

# 使用自适应阈值处理
thresh_img = cv2.adaptiveThreshold(gray_img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

# 显示原始图像和处理后的图像
cv2.imshow('Original Image', gray_img)
cv2.imshow('Adaptive Threshold Image', thresh_img)

# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,blockSize 设置为 11(一个奇数),C 设置为 2。你可以根据图像的特点调整这些参数以获得最佳效果。

标签:阈值,python,cv2,opencv,thresh,图像,THRESH,二值化
From: https://blog.csdn.net/d710055071/article/details/137383717

相关文章

  • Python编程题(for循环与format合用)
    题目描述:用 * 构造一个对角线长 55 个字符,倾斜放置的菱形。输出格式 * ******** *** *首先补充format()格式化刷新函数:当我们了解并会熟练使用format()函数的时候我们便可以写出代码: foriinrange(-2,3):print("{:^5}".format("*"*(5-abs(2*i)......
  • python之数据读取
    在Python中,你可以使用各种库和方法来读取数据,具体取决于数据的类型和格式。以下是一些常用的方法:目录1.内置的open()函数:2.csv模块:这里补充介绍一下csv文件:优点:缺点:csv文件的读写方法:3.使用pandas库:读取数据DataFrame和Series:DataFrame:Series:4.使用numpy库:5.使......
  • 爱心代码Python
    importrandomfromtkinterimport*frommathimportsin,cos,pi,logfor_inrange(520):x,y=random.choice(point_list)x,y=scatter_inside(x,y,0.17)self._center_diffusion_points.add((x,y))heart_halo_point=set()for_inrange(halo_number):t......
  • python项目练习——14.学生管理系统
    这个项目可以让用户管理学生的信息,包括学生的姓名、年龄、成绩等,并提供添加、编辑、删除、查询等功能。这个项目涉及到数据库操作、用户界面设计、数据验证等方面的技术。代码示例:importtkinterastk #导入Tkinter库importsqlite3 #导入sqlite3库classStude......
  • Python - arxiv
    arxiv文章目录arxiv一、关于arxiv.py安装二、使用示例1、获取结果2、下载papers3、自定义client获取结果4、日志三、类型说明1、Client2、Search3、Result一、关于arxiv.pygithub:https://github.com/lukasschwab/arxiv.pyarxiv.py是arXivAPI的......
  • 如何利用c调用python代码
    C语言调用python通过C语言调用Python代码,需要先安装libpython3的dev依赖库(不同的ubuntu版本下,python版本可能会有差异,比如ubuntu22.04里是libpython3.10-dev)。首先可以通过以下命令验证是否是否已经存在python3的dev包dpkg-l|greplibpython3正常会有类似如下的输出,出......
  • Python数据分析与可视化笔记 九 分类问题
    分类        分类是找出数据库中一组数据对象的共同特点,并按照分类模式将其划分为不同的类,其目的是通过分类模型,将数据库中的数据项映射到某个给定的类别。        分类学习是一类监督学习的问题,训练数据会包含其分类结果,根据分类结果分为以下几种问题。1.......
  • 11.python的字典dict(下) 遍历字典,结构优化
    11.python的字典dict(下)遍历所有的键值对items()方法是字典的一个内置方法,用于返回字典中所有键值对的视图(view)。它返回一个可迭代的对象,每个元素都是一个包含键和对应值的元组。下面用一个例子来说明items()方法的用法:dict1={'name':'John','age':25,'job':'En......
  • Python企业面试题1 —— 基础篇
    1.b、B、KB、MB、GB的关系?b----位(bit)B----字节(一个字节等于8位)1B=8bit1KB=1024B1MB=1024KB1GB=1024MB2.PE8规范1.使用4个空格而不是tab键进行缩进。2.每行长度不能超过79。3.使用空行来间隔函数和类。4.必要时候,在每一行下写注释。5.......
  • python相对路径导包与绝对路径导包的正确方式
    【python相对路径导包与绝对路径导包的正确方式】python相对路径导包与绝对路径导包的正确方式_哔哩哔哩_bilibilipython导包的难题,今天解决了,相对路径导包和绝对路径导包,均可以!!!,视频播放量5、弹幕量0、点赞数0、投硬币枚数0、收藏人数0、转发人数1,视频作者天龙战神......