图像处理之灰色图转化为RGB图像

       一般情况下我们都是将RGB图像转化为灰色图,很少将灰色图又转化为RGB图像。如果有所需求,将灰色图转化为RGB图像,但是,又发现网上很少有这方面的解答,一下子就会觉得无从下手。我使用opencv-python来解决这个问题。

       都知道opencv中有一个函数cvtcolor()中有一个参数cv2.COLOR_GRAY2BGR,它能直接将灰色图变换成RGB图像吗?

import numpy as np
import cv2
# 首先以灰色读取一张照片
src = cv2.imread("demo.jpg", 0)
# 然后用ctvcolor()函数,进行图像变换。
src_RGB = cv2.cvtColor(src, cv2.COLOR_GRAY2BGR)
# 显示图片
cv2.imshow("input", src)
cv2.imshow("output", src_RGB)
cv2.waitKey(0)
cv2.destroyAllWindows()

显示图片:


可以看出并没有什么改变的,还是灰色图像。那么怎么办?

        RGB图像中有三个维度的信息,每种颜色相当于一个三维向量,表示法则相当于同一个向量在不同的坐标轴下(即不同的基下)的表示。而将其变为灰度后,只剩下一个维度,相当于将三维向量投影为一维标量一样,是不可能回复为原来的向量的。要想恢复,就必须储存另外两个维度的信息,合在一起就是原先的三维向量,这就是原理。

那么怎么做?

       我们要将RGB表示转换为gGB表示,也就是用灰度分量g取代蓝色分量R,蓝色分量B和绿色分量G不变。我们可以从gGB计算出红色分量R,因为灰度g=p*R+q*G+t*B(其中p=0.2989,q=0.5870,t=0.1140),于是R=(g-q*G-t*B)/p。于是我们只要保留B和G两个颜色分量,再加上灰度图g,就可以回复原来的RGB图像。同样,我们这里的g是可以随便取代红绿蓝三种分量中的任一分量的。下面进行演示。

from __future__ import division
import numpy as np
import cv2
src = cv2.imread("C:/Users/12914/Pictures/messi.jpg")
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
# RGB在opencv中存储为BGR的顺序,数据结构为一个3D的numpy.array,索引的顺序是行,列,通道:
B = src[:,:,0]
G = src[:,:,1]
R = src[:,:,2]
# 灰度g=p*R+q*G+t*B(其中p=0.2989,q=0.5870,t=0.1140),于是B=(g-p*R-q*G)/t。于是我们只要保留R和G两个颜色分量,再加上灰度图g,就可以回复原来的RGB图像。
g = src_gray[:]
p = 0.2989; q = 0.5870; t = 0.1140
B_new = (g-p*R-q*G)/t
B_new = np.uint8(B_new)
src_new = np.zeros((src.shape)).astype("uint8")
src_new[:,:,0] = B_new
src_new[:,:,1] = G
src_new[:,:,2] = R
# 显示图像
cv2.imshow("input", src)
cv2.imshow("output", src_gray)
cv2.imshow("result", src_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像显示:



现在就可以看出“result”与“input”图像是一致的了吧。所以,仅通过cvtcolor()函数是没有办法将灰色图直接转化为RGB图像的。


### 如何将RGB图像换为灰度图像 #### 使用OpenCV库实现RGB灰度图像 为了高效地完成这一操作,可以采用OpenCV库中的`cv2.cvtColor()`函数。该函数能够方便地在不同颜色空间之间进行换,在这里主要用于从BGR(OpenCV默认的颜色模式)或RGB格式换成灰度格式。 ```python import cv2 # 加载图像作为彩色图像 (标志 1 表示加载彩) image_bgr = cv2.imread('path_to_image', 1) # 将 BGR 图像换为 RGB (因为 OpenCV 默认读取的是 BGR) image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB) # 换成灰度图像 gray_image = cv2.cvtColor(image_rgb, cv2.COLOR_RGB2GRAY) # 展示结果 cv2.imshow('Gray Image', gray_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码展示了如何先读取一幅彩色图像,再将其换为灰度版本[^1]。 #### 利用Pillow(PIL)库处理图像 另一种常用的方式是借助于Python Imaging Library (PIL),即现在的Pillow库来进行同样的工作。这种方法更加直观易懂: ```python from PIL import Image # 打开一个已有的图像文件 img = Image.open('path_to_image') # 如果需要的话,可在此处对 img 进行其他预处理... # 把它变成灰色调 gray_img = img.convert('L') # 可选:调整亮度等参数后再保存/展示 gray_img.show() # 或者直接保存修改后的图像 gray_img.save('output_gray_image.png') ``` 上述脚本说明了怎样打开一张片并通过调用`.convert('L')`方法轻松获得对应的灰阶表示形式[^3]。
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值