Python-opencv 读取图片RGB/HSI通道值

1. RGB值

RGB即使用红色(R)、绿色(G)、蓝色(B)作为三元色,以三者不同比例的混合产生不同颜色。

dic = {0:'牡丹粉', 1:'苋菜红', 2:'鼠背灰', 3:'卵石紫', 4:'钢青', 5:'竹绿', 6:'油菜花黄'}
img_all = [[[0 for i in range(3)]for j in range(7)]for k in range(1)]
for i in range(1, 7):
    path = str(i) + '.png'
    img = cv2.imread(path)
    b= img[0][0][0]
    g= img[0][0][1]
    r= img[0][0][2]
    print(f'{dic[i-1]}:\t[r,g,b]:[{r},{g},{b}]') 

结果:

牡丹粉:	[r,g,b]:[164,27,41]	
苋菜红:	[r,g,b]:[113,85,90]	
鼠背灰:	[r,g,b]:[47,22,28]	
卵石紫:	[r,g,b]:[20,34,51]	
钢青:	[r,g,b]:[27,166,131]	
竹绿:	[r,g,b]:[247,215,64]	

代码中之所以并非以RGB的顺序读取,是因为cv2的文档中指出虽然cv2读取的格式是“RGB”但是是以BGR的顺序读取

输出图像验证:

dic = {0:'牡丹粉', 1:'苋菜红', 2:'鼠背灰', 3:'卵石紫', 4:'钢青', 5:'竹绿', 6:'油菜花黄'}
img_all = [[[0 for i in range(3)]for j in range(7)]for k in range(1)]
for i in range(1, 7):
    path = str(i) + '.png'
    img = cv2.imread(path)
    b= img[0][0][0]
    g= img[0][0][1]
    r= img[0][0][2]
    img_all[0][i-1][0] = r
    img_all[0][i-1][1] = g
    img_all[0][i-1][2] = b
    print(f'{dic[i-1]}:\t[r,g,b]:[{r},{g},{b}]') 
plt.imshow(img_all)

原始图像:

        

        

        

 

 输出图像:

 

 2. RGB --> HSI

用色调(H)、色饱和度(S)、亮度描述色彩(I)。HSI色彩空间可以用一个圆锥空间模型来描述。通常把色调和饱和度通称为色度,用来表示颜色的类别与深浅程度。

转换公式:

转换代码:

def Rgb2Hsi(r, g, b):
    r /= 255
    g /= 255
    b /= 255
    eps = 1e-8
    h, s, i = 0, 0, 0
    sum_rgb = r + g + b
    min_rgb = min(r, g, b)
    s = 1 - 3  * min_rgb / (sum_rgb + eps)
    h = np.arccos((0.5 * (r + r - g - b)) / (((r - g) ** 2 + (r - b) * (g - b) + eps)) ** 0.5)
    if b > g:
        h = 2 * np.pi - h
    h = h / (2 * np.pi)
    if s == 0:
        h = 0
    i = sum_rgb / 3
    return round(h, 2), round(s, 2), round(i, 2)


dic = {0:'牡丹粉', 1:'苋菜红', 2:'鼠背灰', 3:'卵石紫', 4:'钢青', 5:'竹绿', 6:'油菜花黄'}
for i in range(7):
    path = str(i) + '.png'
    img = cv2.imread(path)
    b= img[0][0][0]
    g= img[0][0][1]
    r= img[0][0][2]
    H, S, I = Rgb2Hsi(r, g, b)
    print(f'{dic[i]}:\t[r,g,b]:[{r},{g},{b}]\t[h,s,i]:[{H},{S},{I}]') 

 结果:

牡丹粉:	[r,g,b]:[234,159,161]	[h,s,i]:[1.0,0.14,0.72]
苋菜红:	[r,g,b]:[164,27,41]	    [h,s,i]:[0.99,0.65,0.3]
鼠背灰:	[r,g,b]:[113,85,90]	    [h,s,i]:[0.97,0.11,0.38]
卵石紫:	[r,g,b]:[47,22,28]	    [h,s,i]:[0.96,0.32,0.13]
钢青:	[r,g,b]:[20,34,51]	    [h,s,i]:[0.59,0.43,0.14]
竹绿:	[r,g,b]:[27,166,131]	[h,s,i]:[0.46,0.75,0.42]
油菜花黄:[r,g,b]:[247,215,64]	[h,s,i]:[0.14,0.63,0.69]
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是回答: 首先,我们需要导入 OpenCV 和 NumPy 库: ```python import cv2 import numpy as np ``` 接下来,我们读取一张蔬菜的 RGB 图像: ```python img = cv2.imread('vegetable.jpg') ``` 然后,我们将 RGB 图像转换为 HSI 空间: ```python # 将 RGB 图像转换为浮点型 img_float = np.float32(img) / 255.0 # 提取三个通道 B, G, R = cv2.split(img_float) # 计算 H 通道 numerator = 0.5 * ((R - G) + (R - B)) denominator = np.sqrt((R - G) ** 2 + (R - B) * (G - B)) theta = np.arccos(numerator / (denominator + 1e-5)) H = theta.copy() H[B > G] = 2 * np.pi - H[B > G] # 计算 S 通道 S = 1 - 3 * np.minimum(np.minimum(R, G), B) / (R + G + B + 1e-5) # 计算 I 通道 I = (R + G + B) / 3 # 将 HSI 图像转换为 OpenCV 可以显示的格式 H = H / (2 * np.pi) * 180 S = S * 255 I = I * 255 HSI = cv2.merge([H, S, I]) HSI = np.uint8(HSI) ``` 接着,我们可以对 HSI 空间的三个通道进行变换,例如,我们将 H 通道加上 30 度,S 通道减去 50,I 通道加上 20: ```python # 对 HSI 空间的三个通道进行变换 H, S, I = cv2.split(HSI) H = (H + 30) % 180 S = np.clip(S - 50, 0, 255) I = np.clip(I + 20, 0, 255) HSI_transformed = cv2.merge([H, S, I]) ``` 最后,我们可以将 HSI 空间的图像转换回 RGB 空间,并显示出来: ```python # 将 HSI 图像转换为 RGB 图像 HSI_transformed = np.float32(HSI_transformed) H, S, I = cv2.split(HSI_transformed) H = H / 180.0 * np.pi S = S / 255.0 I = I / 255.0 B = I G = I R = I for i in range(HSI_transformed.shape[0]): for j in range(HSI_transformed.shape[1]): if S[i, j] < 1e-5: continue h = H[i, j] s = S[i, j] i = I[i, j] if h < 2 * np.pi / 3: B[i, j] = i * (1 - s) R[i, j] = i * (1 + s * np.cos(h) / np.cos(np.pi / 3 - h)) G[i, j] = 3 * i - (R[i, j] + B[i, j]) elif h < 4 * np.pi / 3: h = h - 2 * np.pi / 3 R[i, j] = i * (1 - s) G[i, j] = i * (1 + s * np.cos(h) / np.cos(np.pi / 3 - h)) B[i, j] = 3 * i - (R[i, j] + G[i, j]) else: h = h - 4 * np.pi / 3 G[i, j] = i * (1 - s) B[i, j] = i * (1 + s * np.cos(h) / np.cos(np.pi / 3 - h)) R[i, j] = 3 * i - (G[i, j] + B[i, j]) RGB = cv2.merge([B, G, R]) RGB = np.uint8(np.clip(RGB * 255.0, 0, 255)) # 显示结果 cv2.imshow('Original Image', img) cv2.imshow('Transformed Image', RGB) cv2.imshow('Original Histogram', cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)) cv2.imshow('HSI Histogram', cv2.cvtColor(HSI, cv2.COLOR_BGR2GRAY)) cv2.imshow('Transformed Histogram', cv2.cvtColor(RGB, cv2.COLOR_BGR2GRAY)) cv2.waitKey(0) ``` 最后,我们可以分别对 HSI 空间的三个通道和单独的 I 通道进行直方图均衡化,然后进行对比。具体实现方法如下: 对 HSI 空间的三个通道进行直方图均衡化: ```python # 对 HSI 空间的三个通道进行直方图均衡化 H, S, I = cv2.split(HSI) H = cv2.equalizeHist(H) S = cv2.equalizeHist(S) I = cv2.equalizeHist(I) HSI_equalized = cv2.merge([H, S, I]) ``` 对单独的 I 通道进行直方图均衡化: ```python # 对单独的 I 通道进行直方图均衡化 H, S, I = cv2.split(HSI) I = cv2.equalizeHist(I) HSI_I_equalized = cv2.merge([H, S, I]) ``` 然后,我们可以将直方图均衡化后的图像显示出来: ```python # 显示直方图均衡化的结果 cv2.imshow('HSI Equalized', cv2.cvtColor(HSI_equalized, cv2.COLOR_HSV2BGR)) cv2.imshow('HSI I Equalized', cv2.cvtColor(HSI_I_equalized, cv2.COLOR_HSV2BGR)) cv2.waitKey(0) ``` 完整代码如下:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云龙弓手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值