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

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)计算方式,极大地简化了开发…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

FFmpeg:Windows系统小白安装及其使用

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

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...