Python OpenCV中的图像阈值处理

news2024/11/28 6:26:27

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的图像阈值处理接口使用比较简单,但作用很重要,它是很多高级算法的前置条件,比如图形检测,轮廓识别等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS使用 — 合理使用内存 “ 任务中创建任务 ”

前言 在我们学习 RTOS 的过程中,很多朋友都不会遇到内存不够的问题,因为大部分的开发板使用的芯片对学习来说,内存 “足够大” 。所以基本上很多人学会了基本功能,到了实际工作中使用,往往会遇到内存不够的问题&#…

pikachu靶场-10 XXE漏洞

XXE漏洞 概述 XXE -“xml external entity injection” 既"xml外部实体注入漏洞"。 概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题" 也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严…

shell语法总结一(持续补充)

文章目录一、变量1、变量的命名规则2、查看变量3、删除命令4、变量的作用域4.1、局部变量4.2、全局变量4.3、环境变量5、自定义变量6、只读变量二、字符串1、单引号2、双引号(用的多)3、拼接字符串4、获取字符串的长度5、提取子字符串三、shell数组1、定…

必须掌握的数据库面试问题

一、为什么用自增列作为主键 1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。 如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。 如果也没有这样的唯一索引,则InnoDB会选择内置…

1990-2021年全国各省产业高级化 数据

1990-2021年全国各省产业高级化数据 1、来源为:统计NJ、各省NJ 2、包括:全国31个省份 3、时间:1990-2021年 4、指标包括: 各地区经纬度、第三产业增加值、第二产业增加值、高级化水平 高级化水平第三产业增加值(亿元) / 第二…

HTTP协议【报文格式】

文章目录HTTP协议什么是HTTP协议HTTP协议格式抓包工具的使用HTTP请求URLURL的组成URL encodeHTTP请求的报文格式HTTP响应的报文格式HTTP方法GET方法POST方法POST方法与GET方法的区别请求报头HTTP响应状态码状态码的组成状态码的类别HTTP协议 什么是HTTP协议 HTTP协议即Hyper T…

m基于GA遗传优化的多因素加权竞价博弈频谱分配算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 假设有M个用户均为MIMO Full Duplex&#xff0c;N个频率&#xff0c;1<N<M&#xff0c;设计算法实现M个用户与N个频率的匹配。 由于在一个MIMO系统中&#xff0c;用户数量M大于可用的频谱个…

web自动化测试入门篇04——selenium+python基础方法封装

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

记录一次解决centos不定时触发oom的经历

前言 前一段时间&#xff0c;业务部门的系统不定时的反馈&#xff0c;系统打开不了&#xff0c;提示&#xff1a; 等技术开发同学反应过来去查看业务状态时&#xff0c;服务又恢复了&#xff0c;由于不是核心的业务&#xff0c;并且出问题差不多1分钟左右&#xff0c;没太在意…

【Vue 快速入门系列】todoList案例小总结

文章目录一、案例效果二、项目介绍三、版本更新迭代末、项目素材1.css样式2.html一、案例效果 如下图所示&#xff0c;制作一个这样的记事本&#xff0c;可以使用这个记事本进行数据的存储以及管理&#xff0c;样式是天禹老师写好的我们直接使用就好了&#xff0c;主要在这个小…

[UE][UE5]零基础学习-学习记录1-UE5安装与基本使用方法

[UE5]学习1-UE5安装与基本使用方法写在前面01.作者碎碎念2.UE5安装方法01.UE5需要的电脑配置02.UE5安装方法001.Epic下载002.下载安装UE503.基本使用方法001.创建项目打开现有的项目&#xff1a;002.文件目录结构003.用户界面介绍1).3D画面视窗2).菜单栏3).内容浏览器4).属性面…

关于CM3/CM4位带操作的总结

1.位带操作定义 STM32的存储器映射中的内存区域和外设区域有一段地址空间&#xff08;都是最低1MB&#xff09;是位带区域&#xff0c;跟这个区域相对应的有一段位带别名区域&#xff0c;位带别名区的大小是位带区的32倍&#xff0c;位带别名区的每一个地址都对应位带区域的一个…

C. Hamiltonian Wall edu139 div2

Problem - C - Codeforces 题意是给你一个2*n的网格&#xff0c;让你一笔把所有的B涂满&#xff0c;并且只能涂一次&#xff0c;问你是否可行 分析&#xff1a; 其实分析的时候我想到了转移。每一次的结果是由上一次转移而来&#xff0c;所以如果前后矛盾的话&#xff0c;即…

人工智能:智能语音技术应用场景介绍

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

虹科QA | SWCF2022 12月6日演讲笔记:C波段卫星与5G之间的干扰排查及解决方案

虹科2022年度SWCF卫星通信与仿真测试研讨会正在进行中。昨日精彩演讲&#xff1a;C波段卫星与5G之间的干扰排查及解决方案&#xff0c;感谢大家的观看与支持&#xff01; 昨晚的直播间收到一些粉丝的技术问题&#xff0c;虹小科汇总了热点问题并请讲师详细解答&#xff0c;在此…

目前UI设计薪资待遇怎么样?工作好找吗?

UI设计的火爆&#xff0c;导致有很多年轻人都愿意投身于这个行业。有很多年轻的朋友都在问&#xff0c;UI设计的薪资待遇怎么样&#xff1f;工作难找吗&#xff1f;本文统一解答一下。 1、UI设计的薪资水平 UI设计的薪资待遇一直很好&#xff0c;学习UI设计之前没有任何相关基础…

PMP每日一练 | 考试不迷路-12.13(包含敏捷+多选)

被延期考试的宝子 一定要坚持刷题 每日5道PMP习题助大家上岸PMP&#xff01; ​题目1-2&#xff1a; ​1.一位主要相关方要求将每日站立会议的持续时间人15分钟增加到1小时。Scrum主管应该做什么? ( ) A.接受建议并建议团队更改会议时间表 B.安排与产品负责人和团队开…

窗口销毁消息 WM_DESTROY 的正确处理方式

上次&#xff0c;我提到了可能导致正常的消息循环被破坏的怪异之处。 有一位读者 Adrian 指出&#xff0c;WM_GETMINMAXINFO 消息在顶级窗口 WM_NCCREATE 之前到达。这确实很不幸&#xff0c;但&#xff08;无论是否错误&#xff09;十多年来一直如此&#xff0c;现在修改它会…

【实时数仓】实现用户行为日志相关功能(源码)

文章目录一 准备用户行为日志-DWD层1 代码实现&#xff08;1&#xff09;识别新老访客&#xff08;2&#xff09;利用侧输出流实现数据拆分&#xff08;3&#xff09;将不同流的数据推送到下游kafka的不同Topic&#xff08;分流&#xff09;a 封装方法b 程序中调用kafka工具类获…

数据链路层

文章目录数据链路层的功能ARP协议DNS-------域名解析&#xff08;浅浅的了解一下&#xff09;在浏览器中输入URL后&#xff0c;发生的事情&#xff08;经典面试题&#xff09;ICMP协议NAT技术代理服务器网络核心知识大总结数据链路层的功能 对比理解网络层。 网络层 &#xff…