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进入到如下页面随后将其中的表情注释的快捷键删除即可...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...