当前位置: 首页 > news >正文

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 RGB分别是彩色图像的红、绿、蓝通道的值, 0.299 、 0.587 、 0.114 0.299、0.587、0.114 0.2990.5870.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作为阈值处理的类型。阈值大小由blockSizeC两个参数共同决定,可以通过调整这两个参数来得到更适合的分割效果。

相关文章:

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%&#xff0…...

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进入到如下页面随后将其中的表情注释的快捷键删除即可...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...