动手学OpenCV-彩色图像空间转换


1、现在初期的目标就是做一个简单的掉包侠;我也虽然知道原理,但是总感觉:用代码表达出来很困难;
2、图像彩色空间互转在图像处理中应用非常广泛,而且很多算法只对灰度图有效;另外,相比RGB,其他颜色空间(比如HSV、HSI)更具可分离性和可操作性,所以很多图像算法需要将图像从RGB转为其他颜色空间,所以图像彩色互转是十分重要和关键的。

1 学习内容

1、掌握相关颜色空间的原理和颜色空间相互转理论
2、掌握OpenCV框架下颜色空间互转API的使用
3、提高进阶版:根据原理动手实践出来

2 算法理论介绍与资料推荐

2.1 RGB与灰度图互转

RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,是在绘画色彩中调制出来各种颜色;
但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将色调,亮度,饱和度三个量放在一起表示,很难分开;—有个立体图来表示
它是最通用的面向硬件的彩色模型。该模型用于彩色监视器和一大类彩色视频摄像;
原理:RGB颜色空间 基于颜色的加法混色原理,从黑色不断叠加Red,Green,Blue的颜色,最终可以得到白色
我们常常需要将彩色图像转换成灰度图像,也就是3个通道(RGB)转换成1个通道。

2.1.1 平均法

最简单的方法当然就是平均法,将同一个像素位置3个通道RGB的值进行平均。
I(x,y) = 1/3 * I_R(x,y) +1/3 * I_G(x,y)+ 1/3 * I_B(x,y)

# %% 使用平均值法
# I(x,y) = 1/3 * I_R(x,y) +1/3 * I_G(x,y)+ 1/3 * I_B(x,y)
import cv2
import numpy as np

img=cv2.imread('lena.jpg')

rows,cols,channel = img.shape

lena_average_gray = np.zeros((rows,cols))

for r in range(rows):
    for l in range(cols):
        lena_average_gray[r, l] = 1 / 3 * img[r, l, 0] + 1 / 3 *img[r, l, 1] + 1 / 3 * img[r, l, 2]
cv2.imshow('img',img)
cv2.imshow('lena_gray',lena_average_gray.astype("uint8"))
cv2.waitKey()

2.1.2 最大最小值平均法

# %% 最大最小平均法
# 取同一个像素位置的RGB中亮度最大的和最小的进行平均
# I(x,y) = 0.5 * max(I_R(x,y), I_G(x,y), I_B(x,y))+ 0.5 * min(I_R(x,y), I_G(x,y), I_B(x,y))
import cv2
import numpy as np

img=cv2.imread('lena.jpg')
rows,cols,channel = img.shape


lena_maxmin_gray=np.zeros((rows,cols))

for r in range(rows):
    for l in range(cols):
        lena_maxmin_gray[r,l] = 1/2(max(img[r,l,0],img[r,l,1],img[r,l,2])+min(img[r,l,0],img[r,l,1],img[r,l,2]))

cv2.imshow('lena_maxmin',lena_maxmin_gray.astype("uint8"))
cv2.waitKey()

2.1.3 加权平均法

# %% 加权平均法
# 最流行的 I(x,y) = 0.3 * I_R(x,y) +0.59 * I_G(x,y)+ 0.11 * I_B(x,y)

import cv2
import numpy as np

img=cv2.imread('lena.jpg')
rows,cols,channel = img.shape


lena_weight_gray =np.zeros((rows,cols))

for r in range(rows):
    for l in range(cols):
        lena_weight_gray[r,l] = 0.3*img[r,l,0]+0.59*img[r,l,1]+0.11*img[r,l,2]

cv2.imshow('lena_weight',lena_weight_gray.astype("uint8"))
cv2.waitKey()

2.2 RGB与HSV互转

HSV和HSI之间的不同就只是亮度的不同 一个是取最大值 I(R,G,B),一个是取平均值;
为什么需要HSV彩色图像格式呢? 相比原始的RGB图像,HSI图像对颜色信息的利用率更高,更适合于目标分析和目标分割等场景。
用一幅图来解释HSI的模型:

色调(Hue):是指一种纯色的颜色属性;黄色,橙色之类的
饱和度(Saturation):是指纯色被白光稀释的程度的度量,(饱和度越大越鲜艳);
亮 度(Intensity):是一个主观因子,实际上是不可度量的,(亮度和图像灰度是颜色的明亮程度)
H=色相;决定是什么颜色,S=饱和度(纯度);决定颜色浓淡,B=明度(亮度);决定照射在颜色上的白光有多亮

2.2.1 RGB2HSI

2.2.2 HSI2RGB

3 代码实践

3.1 调用OpenCV实现

# 不知道为什么就是最后实现不出来
import cv2
import numpy as np

lena_BGR=cv2.imread('lena.jpg')

lena_RGB=cv2.cvtColor(lena_BGR,cv2.COLOR_BGR2RGB)

lena_HSV=cv2.cvtColor(lena_BGR,cv2.COLOR_BGR2HSV)

cv2.imshow('lena_weight',lena_HSV.astype("uint8"))
cv2.waitKey()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值