图像处理-彩色空间(RGB转换为HSI)

问题:

考察下面的一幅500x500的彩色图像,其中的方块部分分别为纯的红、绿和蓝色。

1. 如果将此图像转换到HSI空间,对H分量图像用一个25x25的算术平均掩模进行处理,再转换回到RGB空间,得到的结果将是怎么样的?

2.采取上面同样的步骤,只是这次处理的是S分量,结果又会怎样?

在HSI颜色空间中,颜色由色相、饱和度和强度三个分量表示。

H(色相):表示颜色在色轮上的位置,在0到360度之间取值并且从红开始逆时针旋转,将所有颜色都描述为类似于彩虹的环。

S(饱和度):表示颜色的纯度或鲜艳程度,取值范围为0到1。值为0表示灰色或无色的,值为1表示颜色非常纯。

I(强度):表示颜色的亮度或明度,取值范围为0到1。值为0表示黑色,值为1表示白色。

import cv2
import numpy as np


def RGB2HSI(rgb_img):
   """
   这是将RGB彩色图像转化为HSI图像的函数
   :param rgm_img: RGB彩色图像
   :return: HSI图像
   """
   # 保存原始图像的行列数
   row = np.shape(rgb_img)[0]
   col = np.shape(rgb_img)[1]
   # 对原始图像进行复制
   hsi_img = rgb_img.copy()
   # 对图像进行通道拆分
   B, G, R = cv2.split(rgb_img)
   # 把通道归一化到[0,1]
   [B, G, R] = [i / 255.0 for i in ([B, G, R])]
   H = np.zeros((row, col))  # 定义H通道
   I = (R + G + B) / 3.0  # 计算I通道
   S = np.zeros((row, col))  # 定义S通道
   for i in range(row):
       den = np.sqrt((R[i] - G[i]) ** 2 + (R[i] - B[i]) * (G[i] - B[i]))
       thetha = np.arccos(0.5 * (R[i] - B[i] + R[i] - G[i]) / den)  # 计算夹角
       h = np.zeros(col)  # 定义临时数组
       # den>0且G>=B的元素h赋值为thetha
       h[B[i] <= G[i]] = thetha[B[i] <= G[i]]
       # den>0且G<=B的元素h赋值为thetha
       h[G[i] < B[i]] = 2 * np.pi - thetha[G[i] < B[i]]
       # den<0的元素h赋值为0
       h[den == 0] = 0
       H[i] = h / (2 * np.pi)  # 弧度化后赋值给H通道
   # 计算S通道
   for i in range(row):
       min = []
       # 找出每组RGB值的最小值
       for j in range(col):
           arr = [B[i][j], G[i][j], R[i][j]]
           min.append(np.min(arr))
       min = np.array(min)
       # 计算S通道
       S[i] = 1 - min * 3 / (R[i] + B[i] + G[i])
       # I为0的值直接赋值0
       S[i][R[i] + B[i] + G[i] == 0] = 0
   # 扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间
   hsi_img[:, :, 0] = H * 255
   hsi_img[:, :, 1] = S * 255
   hsi_img[:, :, 2] = I * 255
   return hsi_img


def HSI2RGB(hsi_img):
   """
   这是将HSI图像转化为RGB图像的函数
   :param hsi_img: HSI彩色图像
   :return: RGB图像
   """
   # 保存原始图像的行列数
   row = np.shape(hsi_img)[0]
   col = np.shape(hsi_img)[1]
   # 对原始图像进行复制
   rgb_img = hsi_img.copy()
   # 对图像进行通道拆分
   H, S, I = cv2.split(hsi_img)
   # 把通道归一化到[0,1]
   [H, S, I] = [i / 255.0 for i in ([H, S, I])]
   R, G, B = H, S, I
   for i in range(row):
       h = H[i] * 2 * np.pi
       # H大于等于0小于120度时
       a1 = h >= 0
       a2 = h < 2 * np.pi / 3
       a = a1 & a2  # 第一种情况的花式索引
       tmp = np.cos(np.pi / 3 - h)
       b = I[i] * (1 - S[i])
       r = I[i] * (1 + S[i] * np.cos(h) / tmp)
       g = 3 * I[i] - r - b
       B[i][a] = b[a]
       R[i][a] = r[a]
       G[i][a] = g[a]
       # H大于等于120度小于240度
       a1 = h >= 2 * np.pi / 3
       a2 = h < 4 * np.pi / 3
       a = a1 & a2  # 第二种情况的花式索引
       tmp = np.cos(np.pi - h)
       r = I[i] * (1 - S[i])
       g = I[i] * (1 + S[i] * np.cos(h - 2 * np.pi / 3) / tmp)
       b = 3 * I[i] - r - g
       R[i][a] = r[a]
       G[i][a] = g[a]
       B[i][a] = b[a]
       # H大于等于240度小于360度
       a1 = h >= 4 * np.pi / 3
       a2 = h < 2 * np.pi
       a = a1 & a2  # 第三种情况的花式索引
       tmp = np.cos(5 * np.pi / 3 - h)
       g = I[i] * (1 - S[i])
       b = I[i] * (1 + S[i] * np.cos(h - 4 * np.pi / 3) / tmp)
       r = 3 * I[i] - g - b
       B[i][a] = b[a]
       G[i][a] = g[a]
       R[i][a] = r[a]
   rgb_img[:, :, 0] = B * 255
   rgb_img[:, :, 1] = G * 255
   rgb_img[:, :, 2] = R * 255
   return rgb_img


def average_filter(hsi_img):
   H = hsi_img[:, :, 0]
   # 对图像进行均值滤波
   H_new = cv2.blur(H, (25, 25))
   hsi_img[:, :, 0] = H_new
   return hsi_img


def run_main():
   """
   这是主函数
   """
   # 利用opencv读入图片
   rgb_img = cv2.imread('image1.bmp', cv2.IMREAD_COLOR)
   # 进行颜色空间转换
   hsi_img = RGB2HSI(rgb_img)
   img_filter = average_filter(hsi_img)
   rgb_img2 = HSI2RGB(img_filter)
   cv2.imshow("Origin", rgb_img)
   cv2.imshow("HSI", hsi_img)
   cv2.imshow("RGB", rgb_img2)
   cv2.imwrite("HSI.jpeg",hsi_img)
   cv2.imwrite("RGB.jpeg", rgb_img2)
   cv2.waitKey()
   cv2.destroyAllWindows()


if __name__ == '__main__':
   run_main()

结果图:

对H分量进行处理:

对S分量进行处理:

 可以看到,对H分量进行掩模处理后图像色块交界处明显变模糊了许多,而对S分量处理后图像基本没啥变化。打印出S分量发现图像饱和度都是255,所以均值滤波后饱和度没有发生改变;而H分量则不同颜色色块的值不一样,所以均值滤波过后在色块交界处有明显的变化。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

F0reverBound

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

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

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

打赏作者

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

抵扣说明:

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

余额充值