Python OpenCV中的图像阈值处理

2023-11-18

1 前言

上一篇介绍了用C++如何对一幅图像进行阈值处理,本篇接着用python来做同样的事情。

图像阈值处理是很多高级算法的底层逻辑之一,比如在做图形检测,轮廓识别时,常常会先对图像进行阈值处理,然后再进行具体的检测或识别。因此很有必要掌握图像的阈值处理技术。接下来我们一起探索一下OpenCV中的简单阈值处理、自适应阈值处理和Otsu阈值处理方法。

2 接口函数

使用Python调用OpenCV,实现阈值处理,主要使用了2个接口函数,以下是函数说明。

retval, dst = cv2.threshold(src, thresh, maxval, type)

参数说明:

参数1待处理的图像,可以是彩色图像或灰度图像,建议使用灰度图像

参数2阈值,一般在125~150之间取一个阈值,效果比较好

参数3阈值处理采用的最大值

参数4阈值处理类型,包括以下表格中的5种类型之一,表示简单的阈值处理;若要使用Otsu方法进行阈值处理,该参数在下列5种类型选择一个后,再加上THRESH_OTSU,比如THRESH_BINARY + THRESH_OTSU

 返回值说明:

返回值1:处理是采用的阈值

返回值2:阈值处理后的图像

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

参数说明:

参数1待处理的图像,必须使用灰度图像

参数2阈值处理采用的最大值

参数3自适应阈值计算方法,包括2种,如下表所示

枚举定义

意义

ADAPTIVE_THRESH_MEAN_C 

对一个正方形区域内的所有像素平均加权

ADAPTIVE_THRESH_GAUSSIAN_C 

根据高斯函数按照像素与中心点的距离对一个正方形区域内的所有像素进行加权计算

 参数4:阈值处理类型,仅包括以下2种:THRESH_BINARY或THRESH_BINARY_INV

参数5一个正方形区域的大小,例如11,就是11 x 11的矩阵区域

参数6常量,阈值等于均值或加权值减去这个常量值

返回值:阈值处理后的图像

3 创建测试项目

创建测试项目、配置开发环境,具体可参考之前文章,这里就不多说了

Win10+Python3.10+OpenCV4.6.0加载显示图片_来灵的博客-CSDN博客_opencv-python4.6

这次测试项目名称img_threshold,VS2022种创建好的项目截图:

将下列代码编辑到img_threshold.py文件里,代码中有详细的注释:


# !usr/bin/env python
# -*- coding: utf-8 -*-
import cv2

#简单阈值处理
def SimpleThresholding(filePath):
    print("start simple thresholding test...")

    #以灰度图方式打开图像
    src = cv2.imread(filePath, cv2.IMREAD_GRAYSCALE)

    #打开失败
    if src is None:
        print("Error opening image...")
        return

    #显示原图
    cv2.imshow('src', src)

    #二值化处理
    ret, dst = cv2.threshold(src, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow('binary', dst)
    cv2.imwrite('binary.jpg', dst)

    #反二值化处理
    ret, dst = cv2.threshold(src, 127, 255, cv2.THRESH_BINARY_INV)
    cv2.imshow('binary-inv', dst)
    cv2.imwrite('binary-inv.jpg', dst)

    #截断阈值处理
    ret, dst = cv2.threshold(src, 127, 255, cv2.THRESH_TRUNC)
    cv2.imshow('trunc', dst)
    cv2.imwrite('trunc.jpg', dst)

    #低于阈值0处理
    ret, dst = cv2.threshold(src, 127, 255, cv2.THRESH_TOZERO)
    cv2.imshow('tozero', dst)
    cv2.imwrite('tozero.jpg', dst)

    #超出阈值0处理
    ret, dst = cv2.threshold(src, 127, 255, cv2.THRESH_TOZERO_INV)
    cv2.imshow('to-zero-inv', dst)
    cv2.imwrite('to-zero-inv.jpg', dst)

    #按下任何键盘按键后退出
    cv2.waitKey()
    #销毁所有窗口
    cv2.destroyAllWindows()

    print("stop test...")

#自适应阈值处理
def AdaptiveThresholding(filePath):
    print("start adaptive thresholding test...")

    #以灰度图方式打开图像
    src = cv2.imread(filePath, cv2.IMREAD_GRAYSCALE)

    #打开失败
    if src is None:
        print("Error opening image...")
        return

    #显示原图
    cv2.imshow('src', src)

    #二值化处理
    ret, dst = cv2.threshold(src, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow('binary', dst)
    cv2.imwrite('binary.jpg', dst)

    #自适应阈值
    #阈值是邻近区域的平均值减去常数C
    dst = cv2.adaptiveThreshold(src, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
    cv2.imshow('mean-binary', dst)
    cv2.imwrite('mean-binary.jpg', dst)

    #自适应阈值
    #阈值是邻域值的高斯加权和减去常数C
    dst = cv2.adaptiveThreshold(src, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    cv2.imshow('gauss-binary', dst)
    cv2.imwrite('gauss-binary.jpg', dst)

    #按下任何键盘按键后退出
    cv2.waitKey()
    #销毁所有窗口
    cv2.destroyAllWindows()

    print("stop test...")

#Otsu阈值处理
def OtsuThresholding(filePath):
    print("start otsu thresholding test...")

    #以灰度图方式打开图像
    src = cv2.imread(filePath, cv2.IMREAD_GRAYSCALE)

    #打开失败
    if src is None:
        print("Error opening image...")
        return

    #显示原图
    cv2.imshow('src', src)

    #二值化处理
    ret, dst = cv2.threshold(src, 127, 255, cv2.THRESH_BINARY)
    cv2.imshow('binary', dst)
    cv2.imwrite('binary.jpg', dst)

    #Otsu阈值
    ret,dst = cv2.threshold(src, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    cv2.imshow('otsu-binary', dst)
    cv2.imwrite('otsu-binary.jpg', dst)

    #高斯去噪后使用Otsu阈值处理
    blur = cv2.GaussianBlur(src, (5,5), 0)
    ret,dst = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    cv2.imshow('gaussblur-binary', dst)
    cv2.imwrite('gaussblur-binary.jpg', dst)

    #按下任何键盘按键后退出
    cv2.waitKey()
    #销毁所有窗口
    cv2.destroyAllWindows()

    print("stop test...")

if __name__ == '__main__':
    filePath = "test.jpg"
    SimpleThresholding(filePath)

    AdaptiveThresholding(filePath)

    OtsuThresholding('gauss-noise.jpg')

 编辑好代码的项目截图:

测试项目工程当前目录

4 效果截图

简单的阈值处理,以下图像,从左至右,从上到下,依次是原图灰度图像、二值化阈值处理、反二值化阈值处理、截断阈值处理、低于阈值0处理、超出阈值0处理对应的图像。

自适应阈值处理:

 Otsu阈值处理:

 彩色原图:

5 总结

  1. OpenCV中,对图像阈值处理有3种方法:简单的阈值处理、自适应阈值处理和Otsu阈值处理。其中简单的阈值处理又分为5种:二值化阈值处理、反二值化阈值处理、截断阈值处理、低于阈值0处理和超出阈值0处理。
  2. 简单的阈值处理,是选定一个全局的阈值,比如示例代码中的127。然后将图像中所有像素值与阈值做比较进行处理。这对于一幅明暗度分配不均匀的图像来说,并不友好。所以OpenCV提供了自适应阈值处理,自适应阈值处理,将一幅图像分为多个矩形区域,在每个区域,自动计算出一个合适的阈值,将该小区域内的所有像素与阈值比较进行处理。
  3. OpenCV的图像阈值处理接口使用比较简单,但作用很重要,它是很多高级算法的前置条件,比如图形检测,轮廓识别等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python OpenCV中的图像阈值处理 的相关文章

随机推荐

  • 已有一个Excel表格,用VBA批量新建文件夹

    已有一组Excel表格数据 使用VBA快速批量建文件夹 不知道标题怎么写 已经有了这样一组数据 然后需要根据这两组数据新建文件夹 代码如下 Sub 建文件夹 Dim i As Integer 用于下方数组 Dim Arr1 Arr2 定义一
  • 浅析集合不安全例子

    package com bochy list import java util ArrayList import java util List public class ArrayListConcurrentProblem public s
  • 弹性盒子(Flex)相关属性全解析

    目录 基本介绍 添加在父元素上的属性 添加在flex容器上的 一 设置为弹性布局 display flex 二 修改主轴的属性 flex direction 三 设置子元素是否折换 flex wrap 四 设置主轴的对齐方式 justify
  • C语言中函数的调用和函数返回值(17)

    C语言中函数的调用和函数返回值 一 函数的调用形式 按照函数调用出现的形式 可以分为三种调用方式 1 函数调用语句 例如 printf star 2 函数表达式 c 2 max a b 3 函数参数 printf d max a b m m
  • 这可能是全网最详细的python安装教程(windows)

    python安装是学习pyhon第一步 很多刚入门小白不清楚如何安装python 今天我来带大家完成python安装与配置 跟着我一步步来 很简单 你肯定能完成 第一部分 python安装 一 准备工作 1 下载和安装python 认准官方
  • TiggerRamDisk的超详细使用教程(亲测成功)

    目录 一 软件介绍 一 型号对应 二 可以支持的功能 二 操作步骤
  • SAP PO上传异步接口(PO发布Webservice)

    导语 接口是SAP与其他系统进行数据交互的一种方式 在这篇文章中主要讲述通过PO实现的上传接口 即SAP被动接收其他系统发送的数据 注意 对于配置中涉及的基本组件的介绍和创建在前面的博客有说明和介绍 再次不做过多赘述了 一 ESB Ente
  • 去除a标签默认样式_超链接样式的使用CSS入门基础(014)

    今天我们分享关于超链接样式的内容 在浏览器中 超链接的样式有默认样式 点击后样式 鼠标悬停样式和激活样式四种状态 超链接默认情况下是带有下划线的 看起来很丑 用户体验不好 前面我们说到了text decoration none可以去除下划线
  • Unity-后期处理效果之Bloom

    Unity 后期处理效果之Bloom 什么是Bloom Bloom属性 什么是Bloom Bloom是一种游戏常见的一种屏幕效果叫做高光溢出 是一种光学效果 其中来自明亮来源 如闪光 的光表现为泄露到周围对象中 通俗来说就是这种特效可以模拟
  • Visual Studio Code 插件

    Visual Studio Code 插件安装 插件安装 Script插件 Vue插件 插件安装 首页点击 工具和语言 如下图 接下来 在输入框中输入想要安装的插件的名字 点击 install 即可进行安装 Script插件 1 Eslin
  • C++中cout和cerr的区别?

    之前一直在用 但就是没在意两者到底有啥却别 今天又想到这个问题 总结下吧 以下的内容均是本人从网上查阅资料看来整理的 暂时还没有查阅官方资料 不保证准确 欢迎讨论 其实大家平常常会用的主要有三个 cout cerr clog 首先简单介绍下
  • http协议的状态码:404等常见网页错误代码

    http协议的状态码 一 1xx 临时响应 表示临时响应并需要请求者继续执行操作的状态码 100 继续 请求者应当继续提出请求 服务器返回此代码表示已收到请求的第一部分 正在等待其余部分 101 切换协议 请求者已要求服务器切换协议 服务器
  • 滴滴夜莺:从监控告警系统向运维平台演化

    简述 滴滴夜莺 Nightingale 是一款经过大规模生产环境验证的 分布式高性能的运维监控系统 基于Open Falcon 结合滴滴内部的最佳实践 在性能 可维护性 易用性方面做了大量的改进 支撑了滴滴内部数十亿监控指标 覆盖了从系统
  • 惊呆了!女儿拿着小天才电话手表,问我Android启动流程!

    首先 new一个女儿 var mDdaughter new 女儿 6岁 漂亮可爱 健康乖巧 最喜欢玩小天才电话手表和她的爸爸 好了 女儿有了 有一天 女儿问我 爸爸爸爸 你说我玩的这个小天才电话手表怎么这么厉害 随便点一下这个小图片 这个应
  • Manifest合并失败几种原因以及解决方法

    今天遇到了一个报错 Error Execution failed for task app processDebugManifest gt Manifest merger failed with multiple errors see lo
  • c语言合并两个单链表LA和LB,把两个递增的单链表La,Lb,合并成一个递减的单链表Lc...

    原文题是严蔚敏同志的数据结构习题中第二章线性表中提出的问题 原问如下 2 24 假设有两个按元素值递增有序排列的线性表A和B 均以单链表作存储结构 请编写算法将A表与B表归并成一个按元素值递减有序 即非递增有序 允许表中含有值相同的元表 排
  • 基于Vue + vuex + Antd-design-vue实现天气App

    simple weather github 地址 github com WqhForGitHu 效果图 PC端 移动设备端 技术框架 该应用是基于 Vue vuex 实现的 页面的 UI 则是使用了 Antd design vue 库来完成
  • Android 版本统一管理

    前言 因为现在项目都比较模块化 组件化 要用到的model比较多 一个model就有一个build gradle文件 里面都有compileSdkVersion或buildToolsVersion等可能出现版本不一致导致编译出现错误 所以要
  • thinkphp5学习路程 三 数据库操作

    首先我用的是php中文网提供的php工具箱 phpmyadmin管理mysql 在此之前最好对sql语句有所了解 会简单的增删改查等 在里面创建数据库和一张表如下 随后你需要打开数据库的配置文件 目录为 application databa
  • Python OpenCV中的图像阈值处理

    1 前言 上一篇介绍了用C 如何对一幅图像进行阈值处理 本篇接着用python来做同样的事情 图像阈值处理是很多高级算法的底层逻辑之一 比如在做图形检测 轮廓识别时 常常会先对图像进行阈值处理 然后再进行具体的检测或识别 因此很有必要掌握图