opencv将灰度图转为彩色图片
文章目录
- 背景
- 灰度图优势
- opencv读取灰度图
- 彩色转灰度算法
- 需求
- 方法
- 测试代码
背景
在图像处理中通常需要将图片转为灰度图
灰度图,也称为灰度图像或黑白图像,是一种只包含亮度信息而不包含颜色信息的图像。在灰度图中,每个像素的亮度级别通常用0到255之间的整数表示,其中0表示黑色,255表示白色,中间的数值表示不同级别的灰色
灰度图优势
- 简化计算:灰度图像是单通道图像,只有亮度信息,这大大减少了数据量,简化了计算过程。对于许多图像处理算法而言,处理单通道图像比处理多通道图像更快、更高效。
- 减少噪声:彩色图像中的颜色信息会引入额外的噪声,尤其是在低光环境下拍摄的照片中。将图像转换为灰度图像可以帮助去除这种由颜色引起的噪声,从而更容易检测出重要的特征。
- 便于分析:在很多计算机视觉任务中,如边缘检测、特征提取等,灰度图像可以更好地突出物体的轮廓和结构,有助于算法识别和理解图像中的关键元素。
- 节省存储空间:由于灰度图像只有一个通道,因此存储灰度图像所需的存储空间比存储相同分辨率的彩色图像要少得多。
- 提高算法鲁棒性:在某些应用场景下,如人脸识别、文字识别等,灰度图像可以提供足够的信息,同时减少由于光照条件变化导致的颜色变化对算法的影响,提高算法的鲁棒性。
- 便于应用经典算法:许多经典的图像处理算法和理论都是基于灰度图像开发的,例如直方图均衡化、形态学操作、Sobel 边缘检测等。使用灰度图像可以让这些算法更易于实现和应用。
- 降低带宽需求:在网络传输中,灰度图像的数据量较小,可以降低网络带宽的需求,这对于实时视频流等应用尤为重要。
- 便于可视化:在某些情况下,灰度图像更容易观察和分析,特别是在医学影像领域,医生通常会查看灰度图像来进行诊断
opencv读取灰度图
img_gray = cv2.imread(“test,jpg”, cv2.IMREAD_GRAYSCALE)
当使用 cv2.IMREAD_GRAYSCALE
选项读取图像时,读入的图像将自动转换为灰度图像,这意味着该图像只包含一个灰度通道而不是传统的 RGB 三通道。因此,img_gray只包含了亮度信息,而没有色彩信息
彩色转灰度算法
在OpenCV中,将彩色图像转换为灰度图像通常是通过计算彩色图像中每个像素的红、绿、蓝(RGB)三个颜色分量的加权平均值来实现的。最常用的加权方法是使用亮度(或灰度)感知的加权,因为人类对绿色的敏感度最高,对蓝色的敏感度最低
Gray=0.299×R+0.587×G+0.114×B
需求
在图像处理中,当我们将图片转换为灰度图并进行一系列处理后,得到的灰度图实际上已经丢失了原始的颜色信息。如何将灰度图直接“恢复”为彩色图
方法
- 使用灰度图像作为单通道处理,然后复制该单通道图像三次,形成一个伪彩色图像。
- 结合原始彩色图像和处理后的灰度图像,保留原始色彩信息的同时增强对比度
测试代码
import cv2
import numpy as np
import matplotlib.pyplot as plt# 定义直方图均衡化函数
def histogram_equalization(image):# 应用直方图均衡化eq = cv2.equalizeHist(image)return eqimport numpy as np
from PIL import Imagedef combine_enhanced_with_original_color2(enhanced_gray, original_color, output_path):# 加载增强对比度的灰度图像和原始的彩色图像#enhanced_gray = Image.open(enhanced_gray_image_path).convert('L') # 转换为灰度模式#original_color = Image.open(original_color_image_path)print(enhanced_gray.size,original_color.size)# 检查两个图像尺寸是否一致,如果不一致则调整大小#if enhanced_gray.size != original_color.size:# original_color = original_color.resize(enhanced_gray.size)# 将灰度图像转换为三通道图像enhanced_rgb = np.array(enhanced_gray).astype(np.float32)enhanced_rgb = np.stack((enhanced_rgb,) * 3, axis=-1)# 将原始彩色图像转换为numpy数组original_rgb = np.array(original_color).astype(np.float32)# 合并灰度图的对比度信息与彩色图的颜色信息# 这里简单地使用灰度图像作为亮度调整combined_image = np.clip(original_rgb * (enhanced_rgb / 255.), 0, 255).astype(np.uint8)# 创建一个新的PIL图像对象用于保存combined_image_pil = Image.fromarray(combined_image)return combined_image_pil# 保存结果图像#combined_image_pil.save(output_path)# 定义结合增强后的灰度图像与原始彩色图像的函数
def combine_enhanced_with_original_color(original_color, enhanced_gray):# 将灰度图像转换为浮点型enhanced_gray_float = enhanced_gray.astype(np.float32)# 归一化灰度图像到 [0, 1] 区间enhanced_gray_normalized = cv2.normalize(enhanced_gray_float, None, 0, 10, cv2.NORM_MINMAX)# 将灰度图像作为亮度通道与原始彩色图像结合enhanced_color = np.zeros_like(original_color, dtype=np.float32)enhanced_color[:, :, 0] = original_color[:, :, 0] * enhanced_gray_normalizedenhanced_color[:, :, 1] = original_color[:, :, 1] * enhanced_gray_normalizedenhanced_color[:, :, 2] = original_color[:, :, 2] * enhanced_gray_normalized# 将结果转换回 uint8 类型enhanced_color = np.clip(enhanced_color * 255, 0, 255).astype(np.uint8)return enhanced_color# 读取原始彩色图像
image_path = 'js-test01.jpg'
img_color = cv2.imread(image_path)
img_color = cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB) # 转换为 RGB 格式以正确显示颜色# 将彩色图像转换为灰度图像
img_gray = cv2.cvtColor(img_color, cv2.COLOR_RGB2GRAY)# 对灰度图像进行对比度增强
enhanced_img = histogram_equalization(img_gray)# 将增强后的灰度图像作为亮度通道与原始彩色图像结合
#enhanced_color = combine_enhanced_with_original_color(img_color, img_gray)
enhanced_color = combine_enhanced_with_original_color2(img_gray,img_color,"")# 展示图像
plt.figure(figsize=(12, 6))plt.subplot(1, 3, 1)
plt.imshow(img_color)
plt.title('original')
plt.axis('off')plt.subplot(1, 3, 2)
plt.imshow(img_gray)
plt.title('img_gray')
plt.axis('off')plt.subplot(1, 3, 3)
plt.imshow(enhanced_color)
plt.title('enhanced_color')
plt.axis('off')plt.tight_layout()
plt.show()

相关文章:
opencv将灰度图转为彩色图片
文章目录 背景灰度图优势opencv读取灰度图彩色转灰度算法需求 方法测试代码 背景 在图像处理中通常需要将图片转为灰度图 灰度图,也称为灰度图像或黑白图像,是一种只包含亮度信息而不包含颜色信息的图像。在灰度图中,每个像素的亮度级别通常…...
判断PDF与图片是否可以预览
一、判断图片是否可以预览 在JavaScript中,可以使用Image对象来判断一个图片URL是否可以访问。如果图片可以被加载,那么load事件会被触发;如果图片无法访问,error事件会被触发。 function checkImageAccessibility(url, callbac…...
多线程与并发区别
在Java中,多线程与并发是两个既相关又有所区别的概念。我们可以这样来理解它们: 多线程(Multi-threading): 多线程是指程序能够同时执行多个线程。每个线程都是一个独立的执行流,它们共享程序的内存空间&a…...
这个桌面日历真不错 笔记 提醒 生日记录 打卡 翻译都有 真的太方便了!
这个桌面日历真不错 笔记 提醒 生日记录 打卡 翻译都有 真的太方便了!日历产品非常的多,如何选择一个合适自己的桌面日历,这个很重要,今天小编给大家介绍这个芝麻日历,一起看下它有些什么功能,是不是你需要…...
多模态大语言模型综述(中)-算法实用指南
本文是Multimodal Large Language Models: A Survey的译文之算法实用指南部分。 上:摘要、概念与技术要点实用指南中:算法实用指南(本文)下: 任务的实用指南(应用)、挑战等 原始信息 标题: Multimodal Large Language Models: A Survey译文: 多模态大…...
Qt | ubuntu20.04安装Qt6.5.3并创建一个example完整教程(涉及诸多开发细节,商用慎重)
点击上方"蓝字"关注我们 01、下载 >>> 下载Qt在线安装包 这里采用镜像地址进行下载,避免网络过慢。 镜像地址:http://mirrors.ustc.edu.cn/qtproject/archive/online_installers/4.5/ 选择最新版本下载,如截至目前最新版本为qt-unified-linux-x64-4.5.2…...
苏州科技大学、和数联合获得国家知识产权局颁发的3项发明专利证书
近日,基于“苏州科技大学-和数智能软件区块链技术工程实验室”的研究成果,国家知识产权局正式授权了苏州科技大学、苏州和数区块链应用研究院联合申报的3项发明专利证书。 分别为: 一种基于双账本的物联网数据存储与共享方法 一种面向物联网…...
CleanMyMac X2024破解版mac电脑清理工具
今天,我要跟大家分享一个让我彻底告别电脑卡顿的秘密武器——CleanMyMac X。这不仅仅是一款普通的清理工具,它是你电脑的私人健身教练,让电脑焕发青春活力! CleanMyMac直装官方版下载地址: http://wm.makeding.com/i…...
微软数据库的SQL注入漏洞解析——Microsoft Access、SQLServer与SQL注入防御
说明:本文仅是用于学习分析自己搭建的SQL漏洞内容和原理,请勿用在非法途径上,违者后果自负,与笔者无关;本文开始前请认真详细学习《中华人民共和国网络安全法》及其相关法规内容【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安全和信息化委员会办公室】 。…...
无人机之处理器篇
无人机的处理器是无人机系统的核心部件之一,它负责控制无人机的飞行、数据处理、任务执行等多个关键功能。以下是对无人机处理器的详细解析: 一、处理器类型 无人机中使用的处理器主要包括以下几种类型: CPU处理器:CPU是无人机的…...
828华为云征文 | 华为云Flexus X实例上实现Docker容器的实时监控与可视化分析
前言 华为云Flexus X,以顶尖算力与智能调度,引领Docker容器管理新风尚。828企业上云节之际,Flexus X携手前沿技术,实现容器运行的实时监控与数据可视化,让管理变得直观高效。无论是性能瓶颈的精准定位,还是…...
缓存预热/雪崩/穿透/击穿
1. 缓存预热 预先将MySQL中的数据同步至Redis的过程 2. 缓存雪崩 Redis主机出现故障,或有大量的key同时过期大面积失效导致Redis不可用 Redis中key设置为永不过期,或者过期时间错开Redis缓存集群实现高可用多缓存结合预防雪崩服务降级 3. 缓存穿透 …...
C/C++:优选算法
一、双指针 1.1移动零 链接:283. 移动零 - 力扣(LeetCode) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操…...
用于大数据分析的数据存储格式:Parquet、Avro 和 ORC 的性能和成本影响
高效的数据处理对于依赖大数据分析做出明智决策的企业和组织至关重要。显著影响数据处理性能的一个关键因素是数据的存储格式。本文探讨了不同存储格式(特别是 Parquet、Avro 和 ORC)对 Google Cloud Platform (GCP) 上大数据环境…...
【Jupyter Notebook】安装与使用
打开Anaconda Navigator点击"Install"(Launch安装前是Install)点击"Launch" 点击"File"-"New"-"Notebook" 5.点击"Select"选择Python版本 6.输入测试代码并按"EnterShift"运…...
默认端口被占用后,如何修改Apache2 端口
你可以通过以下步骤修改 Apache2 的默认端口(80 端口): 1. 修改 Apache2 配置文件 首先,你需要编辑 Apache2 的端口配置文件: sudo nano /etc/apache2/ports.conf在文件中,你会看到类似以下的内容&#…...
Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(2) (*****生成数据结构类的方式特别有趣****)
本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正 Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(1)-CSDN博客 本节内容 实现目标 通过已经得到的Excel表格…...
Idea 中的一些配置
配置 javap jdk 自带的 javap 可以用来查看字节码信息。 配置过程: 打开设置,定位到 Tools,External Tools新建项,Program 中填 javap 的路径Argument 中填 -c $FileClass$Working directory 中填 $OutputPath$ Argument 中也…...
VulnHub DC-1-DC-7靶机WP
VulnHub DC系列靶机:https://vulnhub.com/series/dc,199/ # VulnHub DC-1 nmap开路获取信息 Nmap scan report for 192.168.106.133 Host is up (0.00017s latency). Not shown: 997 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 1…...
基于DPU的容器冷启动加速解决方案
1. 方案背景 1.1. 业务背景 随着容器技术的迅猛发展与广泛应用,一种新的云计算服务模式应运而生-函数即服务(FaaS, Function as a Service)。FaaS作为一种无服务器(Serverless)计算方式,极大地简化了开发…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
