OpenCV常用功能——灰度处理和图像二值化处理
文章目录
- 一、灰度处理
- 1.1 cvtColor函数
- 二、图像二值化处理
- 2.1 全局阈值
- 2.2 自适应阈值
一、灰度处理
1.1 cvtColor函数
函数原型:
cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst
功能
:转换图像颜色空间。
参数
:
- src: 输入图像。
- code: 颜色空间转换代码。可以取常量cv2.COLOR_BGR2GRAY或cv2.COLOR_RGB2GRAY。
- dst: 输出图像。
- dstCn: 输出图像的通道数,如果设置为0,则跟随转换代码自动设置。
内置函数示例代码:
import cv2
img = cv2.imread("color.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow("Gray", img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
灰度处理的原理是将彩色图像转换成灰度图像
,通常使用的方法是将彩色图像的RGB三个通道的值加权平均,得到一个灰度值,再用这个灰度值代替RGB三个通道的值,从而得到灰度图像。常用的加权平均公式是:
g r a y = 0.299 × R + 0.587 × G + 0.114 × B gray = 0.299 \times R + 0.587 \times G + 0.114 \times B gray=0.299×R+0.587×G+0.114×B
其中, R 、 G 、 B R、G、B R、G、B分别是彩色图像的红、绿、蓝通道的值, 0.299 、 0.587 、 0.114 0.299、0.587、0.114 0.299、0.587、0.114是加权系数,这些系数是心理物理学中根据人眼对不同颜色敏感度的实验结果得出的。这个公式也称为亮度加权法,能够比较好地保留彩色图像的明暗对比度。
通过原理实现灰度处理代码:
import cv2
img = cv2.imread('lean.jpg')
img = cv2.resize(img, (240, 240), interpolation=cv2.INTER_CUBIC)
height, width = img.shape[:2]
gray = np.zeros((height, width, 1), dtype="uint8")
for i in range(height):for j in range(width):gray[i][j] = img[i][j][0] * 0.114 + img[i][j][1] * 0.587 + img[i][j][2] * 0.299 # 加权值法# gray[i][j] = (img[i][j][0] +img[i][j][1]+img[i][j][2])/3#平均值法# gray[i][j] = max(img[i][j][0],img[i][j][1],img[i][j][2]) #最大值法cv2.imshow("Gray", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
上述代码逐个像素点计算灰度值,然后用灰度值代替RGB三个通道的值,得到灰度图像并显示出来。值得注意的是,这种方法虽然简单易懂,但计算每个像素点的灰度值,效率较低,不适用于处理较大的图像。在实际中,我们可以使用OpenCV提供的函数来实现灰度处理,以提高程序的执行效率。
注意:灰度图像在Python中数据类型是numpy的uint8类型,即8位无符号整型。
二、图像二值化处理
图像二值化处理是将灰度图像上的像素点转化为黑白两种颜色的处理方法。
其原理是将灰度图像的像素值按一定的阈值进行分割,大于等于阈值的像素值设为一个值(通常是255),小于阈值的像素值设为另一个值(通常是0)。这样得到的图像就只有黑白两种颜色,便于进行一些形态学处理和特征提取。
图像二值化有两种方法:全局阈值和自适应阈值
。全局阈值
是指将整个图像的像素值都按照同一个阈值进行分割,而自适应阈值
则是将图像分割成若干个小块
,然后对每个小块单独
计算阈值,从而得到更准确的分割结果。下面分别介绍这两种方法的实现方式。
2.1 全局阈值
在OpenCV中,使用cv2.threshold()
函数可以实现全局阈值二值化。函数原型如下:
retval, dst = cv2.threshold(src, thresh, maxval, type)
参数说明:
- src为输入图像,必须为灰度图。
- dst为输出图像,尺寸和类型与原图像相同。
- thresh为设定的阈值。
- maxval为最大值,当像素值大于阈值时,赋值为maxval。
- type为阈值处理的类型,包括以下几种类型:
- cv2.THRESH_BINARY:二值化,当像素值大于阈值时,赋值为maxval,否则赋值为0。
- cv2.THRESH_BINARY_INV:反二值化,当像素值大于阈值时,赋值为0,否则赋值为maxval。
- cv2.THRESH_TRUNC:截断,当像素值大于阈值时,赋值为阈值,否则不变。
- cv2.THRESH_TOZERO:阈值以下归零,当像素值小于阈值时,置为0,否则不变。
- cv2.THRESH_TOZERO_INV:阈值以上归零,当像素值大于阈值时,置为0,否则不变。
示例代码如下:
import cv2# 加载灰度图
img_gray = cv2.imread('lena_gray.jpg', 0)# 全局阈值二值化
retval, img_binary = cv2.threshold(img_gray, 128, 255, cv2.THRESH_BINARY)# 显示图像
cv2.imshow('original', img_gray)
cv2.imshow('binary', img_binary)
cv2.waitKey()
cv2.destroyAllWindows()
其中,使用cv2.imread()加载灰度图时,第二个参数必须设置为0,表示加载灰度图。
2.2 自适应阈值
在OpenCV中,使用cv2.adaptiveThreshold()
函数可以实现自适应阈值二值化
。函数原型和前面的cv2.threshold()函数类似,但多了两个参数:
dst = cv2.adaptiveThreshold(src, maxval, adaptiveMethod, thresholdType, blockSize, C)
参数说明:
- src为输入图像,必须为灰度图。
- maxValue为最大值,当像素值大于阈值时,赋值为maxValue。
- adaptiveMethod为自适应阈值算法类型,包括以下两种类型:
- cv2.ADAPTIVE_THRESH_MEAN_C:计算每个小区域的平均灰度值作为阈值。
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C:计算每个小区域的高斯加权平均灰度值作为阈值。
- thresholdType为阈值处理的类型,同全局阈值二值化函数。
- blockSize为块大小,要求为奇数,代表自适应阈值计算时使用的小区域大小。
- C为常数,阈值减小的常数。
实例代码如下:
import cv2# 加载灰度图
img_gray = cv2.imread('lena_gray.jpg', 0)# 自适应阈值二值化
img_binary = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 127, 1)# 显示图像
cv2.imshow('original', img_gray)
cv2.imshow('binary', img_binary)
cv2.waitKey()
cv2.destroyAllWindows()
其中,使用cv2.ADAPTIVE_THRESH_MEAN_C作为自适应阈值算法,计算每个小块的平均值;使用cv2.THRESH_BINARY作为阈值处理的类型。阈值大小由blockSize
和C
两个参数共同决定,可以通过调整这两个参数来得到更适合的分割效果。
相关文章:
OpenCV常用功能——灰度处理和图像二值化处理
文章目录 一、灰度处理1.1 cvtColor函数 二、图像二值化处理2.1 全局阈值2.2 自适应阈值 一、灰度处理 1.1 cvtColor函数 函数原型: cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst功能:转换图像颜色空间。 参数: src: 输入图像。co…...

excel巧用拼接函数CONCAT输出JSON、SQL字符串
一、前言 工作中有时候需要用Excel对数据进行组装,需要输出JSON或者SQL语句,然后通过脚本或Java程序完成一些特定功能,总结了一下用到的函数,方便以后使用。这里使用的是WPS软件。 二、输出JSON 例如:需要将几列数据…...

Redis桌面管理工具:Redis Desktop Manager for Mac
Redis Desktop Manager是一款非常实用的Redis管理工具,它不仅提供了方便易用的图形用户界面,还支持多种Redis数据结构,可以帮助用户轻松地完成Redis数据库的管理工作。 以下是一些推荐Redis Desktop Manager的理由: 多平台支持&a…...
基于SSM的汽车维修管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的汽车维修管理系统,java项目。 …...
volatile 系列之如何解决可见性问题
下面我们来看一下volatile是如何解决可见性问题的呢?如果我们针对stop字段增加volatile关键字: public static volatile boolean stopfalse; 然后,使用hsdis工具获取IT编译器生成的汇编指令来查看volatile写操作带来的影响和变化。 接着,设置J…...

网络安全(黑客技术)—小白自学
目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类&am…...

MTK AEE_EXP调试方法及user版本打开方案
一、AEE介绍 AEE (Android Exception Engine)是安卓的一个异常捕获和调试信息生成机制。 手机发生错误(异常重启/卡死)时生成db文件(一种被加密过的二进制文件)用来保存和记录异常发生时候的全部内存信息,经过调试和仿真这些信息,能够追踪到异常的缘由。 二、调试方法…...

京东平台数据分析:2023年9月京东扫地机器人行业品牌销售排行榜
鲸参谋监测的京东平台9月份扫地机器人市场销售数据已出炉! 根据鲸参谋平台的数据显示,9月份,京东平台扫地机器人的销量近14万,环比增长约2%,同比降低约4%;销售额为2.9亿,环比降低约4%࿰…...
pytorch 笔记:index_select
1 基本使用方法 index_select 是 PyTorch 中的一个非常有用的函数,允许从给定的维度中选择指定索引的张量值 torch.index_select(input, dim, index, outNone) -> Tensorinput从中选择数据的源张量dim从中选择数据的维度index 一个 1D 张量,包含你想…...

面试算法43:在完全二叉树中添加节点
题目 在完全二叉树中,除最后一层之外其他层的节点都是满的(第n层有2n-1个节点)。最后一层的节点可能不满,该层所有的节点尽可能向左边靠拢。例如,图7.3中的4棵二叉树均为完全二叉树。实现数据结构CBTInserter有如下3种…...
Python算法例3 检测2的幂次
1. 问题描述 检测一个整数n是否为2的幂次。 2. 问题示例 n8,返回True;n6,返回False。 3.代码实现 # 采用UTF-8编码格式 # 参数n是一个整数 # 返回True或者False class Solution:def checkPowerOf2(self,n):ans 1for i in range(31):if …...

线扫相机DALSA--采集卡Base模式设置
采集卡默认加载“1 X Full Camera Link”固件,Base模式首先要将固件更新为“2 X Base Camera Link”。 右键SCI图标,选择“打开文件所在的位置”,找到并打开SciDalsaConfig的Demo,如上图所示: 左键单击“获取相机”&a…...

Gitee 发行版
Gitee 发行版 1、Gitee 发行版管理2、项目仓库中创建发行版本3、项目中导入3.1 gradle配置3.2 dependencies执行正常,包没有下载 1、Gitee 发行版管理 Gitee 发行版(Release)管理 2、项目仓库中创建发行版本 按照Gitee官网操作就行 3、项目…...
python面向对象
用animal举例代码如下: class Animal:name age 0def call(self):print(I am %s, and I\m %d years old. % (self.name, self.age))def isMe(self, name) -> bool:return self.name nameanimal Animal() animal.name coco animal.age 10 animal.call()prin…...

Go基础——数组、切片、集合
目录 1、数组2、切片3、集合4、范围(range) 1、数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。 Go 语言数组声明需要指定元素类型及元素个数,与…...

Error: no matching distribution found for tensorflow-cpu==2.6.*
目录 install_tensorflow()安装过程中遇到的问题 查找解决方案过程中: 解决办法: install_tensorflow()安装过程中遇到的问题 在服务器上安装tensorflow时,遇到了一个报错信息: 在网上找到一个类似的错误(TensorFlow…...

nginx 进程模型
文章目录 nginx运行模式与进程模式进程模式流程图默认初始化运行模式与进程模式(宏展开)cpu_affinity多CPU绑定合理性判定Nginx的daemon创建(os/unix/ngx_daemon.c)运行模式、进程模式启动 多进程模式下master处理流程设置进程信号、初始化信号掩码、屏蔽…...
TypeScript - 枚举类型 -字符型枚举
什么是枚举 枚举就是有固定的元素的一个对象。 对象的元素可以直接列举出来。 什么是字符型枚举 字符型枚举,就是元素的值是字符串。 就这么简单。 定义一个我看看 来,让我们实际看一下字符型的枚举。 // 定义字符型枚举 enum COLOR2{RED red,BLUE blu…...

分布式锁-Redis红锁解决方案
一 分布式锁的概念 1:概念 分布式锁(多服务共享锁) 在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共…...

【Ubuntu 终端终结者Ctrl shift e无法垂直分页解决办法】
Ubuntu 终端终结者Ctrl shift e无法垂直分页解决办法 错误原因解决办法 错误原因 这是因为ibus输入法有一个快捷键占用了这个终端终结者的快捷键 解决办法 打开命令行输入 ibus-setup进入到如下页面随后将其中的表情注释的快捷键删除即可...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...