使用python实现RGB到HSV转换(根据公式)

1.RGB转换HSV公式如下

在这里插入图片描述

2.代码如下


import cv2
import numpy as np
import matplotlib.pyplot as plt
#rgb to hsv
def rgb2hsv(img):
    h = img.shape[0]
    w = img.shape[1]
    H = np.zeros((h,w),np.float32)
    S = np.zeros((h, w), np.float32)
    V = np.zeros((h, w), np.float32)
    r,g,b = cv2.split(img)
    r, g, b = r/255.0, g/255.0, b/255.0
    for i in range(0, h):
        for j in range(0, w):
            mx = max((b[i, j], g[i, j], r[i, j]))
            mn = min((b[i, j], g[i, j], r[i, j]))
            dt=mx-mn

            if mx == mn:
                H[i, j] = 0
            elif mx == r[i, j]:
                if g[i, j] >= b[i, j]:
                    H[i, j] = (60 * ((g[i, j]) - b[i, j]) / dt)
                else:
                    H[i, j] = (60 * ((g[i, j]) - b[i, j]) / dt)+360
            elif mx == g[i, j]:
                H[i, j] = 60 * ((b[i, j]) - r[i, j]) / dt + 120
            elif mx == b[i, j]:
                H[i, j] = 60 * ((r[i, j]) - g[i, j]) / dt+ 240
            H[i,j] =int( H[i,j] / 2)

            #S
            if mx == 0:
                S[i, j] = 0
            else:
                S[i, j] =int( dt/mx*255)
            #V
            V[i, j] =int( mx*255)

    return H, S, V

flags = [i for i in dir(cv2) if i.startswith('COLOR_')]   #show all convertion type
print(flags)

img=cv2.imread("./Images/lena.jpg")
#change into HSV type
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#
#change BGR to RGB
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#get h s v channels
h,s,v = rgb2hsv(img)
merged = cv2.merge([h,s,v]) #前面分离出来的三个通道
merged=np.array(merged,dtype='uint8')

plt.figure(1)
#第一行第一列图形
ax1 = plt.subplot(3,4,1)
plt.sca(ax1)
plt.imshow(img)
plt.title("RGB")
#第一行第二列图形
ax2 = plt.subplot(3,4,2)
plt.sca(ax2)
plt.imshow(img[:,:,0],cmap="gray")
plt.title("R")
#第一行第3列图形
ax3 = plt.subplot(3,4,3)
plt.sca(ax3)
plt.imshow(img[:,:,1],cmap="gray")
plt.title("G")
#第一行第4列图形
ax4 = plt.subplot(3,4,4)
plt.sca(ax4)
plt.imshow(img[:,:,2],cmap="gray")
plt.title("B")
#第2行第1列图形
ax5 = plt.subplot(3,4,5)
plt.sca(ax5)
plt.imshow(hsv)
plt.title("HSV")
#第2行第2列图形
ax6 = plt.subplot(3,4,6)
plt.sca(ax6)
plt.imshow(hsv[:,:,0],cmap="gray")
plt.title("H")
#第2行第3列图形
ax7 = plt.subplot(3,4,7)
plt.sca(ax7)
plt.imshow(hsv[:,:,1],cmap="gray")
plt.title("S")
#第2行第4列图形
ax8 = plt.subplot(3,4,8)
plt.sca(ax8)
plt.imshow(hsv[:,:,2],cmap="gray")
plt.title("V")
#第一行第一列图形
ax9 = plt.subplot(3,4,9)
plt.sca(ax9)
plt.imshow(merged)
plt.title("my hsv")
#第一行第二列图形
ax12 = plt.subplot(3,4,10)
plt.sca(ax12)
plt.imshow(merged[:,:,0],cmap="gray")
plt.title("h")
#第一行第3列图形
ax13 = plt.subplot(3,4,11)
plt.sca(ax13)
plt.imshow(merged[:,:,1],cmap="gray")
plt.title("s")
#第一行第4列图形
ax14 = plt.subplot(3,4,12)
plt.sca(ax14)
plt.imshow(merged[:,:,2],cmap="gray")
plt.title("v")

plt.show()
#cv2.imshow('img',hsv)
#cv2.imshow('hsv',merged)
#cv2.waitKey(0)
#cv2.destroyAllWindows()

3.结果如下

在这里插入图片描述

  • 14
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 当将 RGB 颜色转换HSV 颜色时,可以使用 `colorsys` 模块中的 `rgb_to_hsv` 函数。该函数接受三个参数,分别是 RGB 颜色的红、绿、蓝三个分量的值,返回对应的 HSV 颜色的色调、饱和度和明度三个值,范围分别为 0 到 1。 以下是一个示例代码: ```python import colorsys # 定义 RGB 颜色 r, g, b = 128, 64, 192 # 转换HSV 颜色 h, s, v = colorsys.rgb_to_hsv(r/255, g/255, b/255) # 输出转换结果 print(f"RGB颜色({r}, {g}, {b}) 转换HSV颜色({h:.2f}, {s:.2f}, {v:.2f})") ``` 输出: ``` RGB颜色(128, 64, 192) 转换HSV颜色(0.75, 0.67, 0.75) ``` 同样地,将 HSV 颜色转换RGB 颜色也可以使用 `colorsys` 模块中的 `hsv_to_rgb` 函数。该函数接受三个参数,分别是 HSV 颜色的色调、饱和度和明度三个值,返回对应的 RGB 颜色的红、绿、蓝三个分量的值,范围同样为 0 到 1。 以下是一个示例代码: ```python import colorsys # 定义 HSV 颜色 h, s, v = 0.75, 0.67, 0.75 # 转换RGB 颜色 r, g, b = colorsys.hsv_to_rgb(h, s, v) # 输出转换结果 print(f"HSV颜色({h:.2f}, {s:.2f}, {v:.2f}) 转换RGB颜色({int(r*255)}, {int(g*255)}, {int(b*255)})") ``` 输出: ``` HSV颜色(0.75, 0.67, 0.75) 转换RGB颜色(128, 64, 192) ``` ### 回答2: RGBHSV(Hue-Saturation-Value,色相-饱和度-亮度)是两种不同的颜色模型,在计算机图形学和数字图像处理中广泛应用。RGB是基于红、绿、蓝三色光原色定义的颜色模型,可以表示出各种颜色的混合形式,而HSV则是基于人们对颜色的感受和认知,更能反映颜色的鲜艳度、明暗度和色相的变化。下面来了解一下如何在Python实现RGBHSV之间的转换转换方法 RGBHSV公式如下: ![](https://cdn.jsdelivr.net/gh/smilelijian/mypic/img/Python_hsv_rgb.png) 其中,R、G、B分别是红、绿、蓝三原色,H代表色相,S代表饱和度,V代表亮度。 HSVRGB公式如下: ![](https://cdn.jsdelivr.net/gh/smilelijian/mypic/img/Python_rgb_hsv.png) 其中,H、S、V分别是色相、饱和度和亮度,而R、G、B则是相应的红、绿、蓝三原色。需要注意的是,HSV中的H是一个角度值,用0~360度进行表示。 Python实现方法 Python中有很多方式可以实现RGBHSV之间的转换,例如使用Python自带的colorsys库,具体方法如下: ```python import colorsys # RGB -> HSV rgb = (255, 0, 0) # 红色 hsv = colorsys.rgb_to_hsv(rgb[0]/255.0, rgb[1]/255.0, rgb[2]/255.0) # 转换HSV # HSV -> RGB hsv = (0, 1, 1) # 红色 rgb = colorsys.hsv_to_rgb(hsv[0]/360.0, hsv[1], hsv[2]) # 转换RGB ``` 这种方式比较简单,只需要导入colorsys库,然后使用rgb_to_hsv()和hsv_to_rgb()函数即可。其中,RGB的值需要除以255进行归一化处理,HSV的H值需要除以360进行表示。 除了使用colorsys库之外,还可以使用Pillow库(Python Imaging Library)来实现RGBHSV之间的转换。具体方法如下: ```python from PIL import Image, ImageCms # RGB -> HSV rgb = (255, 0, 0) # 红色 srgb_p = ImageCms.createProfile('sRGB') lab_p = ImageCms.createProfile('LAB') rgb2lab = ImageCms.buildTransformFromOpenProfiles(srgb_p, lab_p, "RGB", "LAB") lab2rgb = ImageCms.buildTransformFromOpenProfiles(lab_p, srgb_p, "LAB", "RGB") rgb = ImageCms.applyTransform(rgb, rgb2lab) hsv = colorsys.rgb_to_hsv(rgb[0]/255.0, rgb[1]/255.0, rgb[2]/255.0) # 转换HSV # HSV -> RGB hsv = (0, 1, 1) # 红色 rgb = colorsys.hsv_to_rgb(hsv[0]/360.0, hsv[1], hsv[2]) # 转换RGB rgb = [int(x*255) for x in rgb] rgb = ImageCms.applyTransform(rgb, lab2rgb) ``` 这种方式需要使用Pillow库,使用LAB颜色空间代替普通的RGB颜色空间,然后通过buildTransformFromOpenProfiles()函数创建颜色空间转换矩阵,再使用applyTransform()函数进行转换,最终得到转换后的RGB值。需要注意的是,最终得到的RGB值需要乘以255并取整。 ### 回答3: RGBHSV是两种表示颜色的方法,RGB是一种基于加色理论的表示方法,HSV是一种基于色相、饱和度、亮度的表示方法。在python中,可以通过使用colorsys模块实现RGBHSV之间的相互转换。下面我们就介绍一下其中的实现方法。 1. RGBHSVRGBHSV化可以用colorsys模块中的rgb_to_hsv()函数来实现,函数的参数为RGB三元组,返回值为HSV三元组。 具体的代码如下: ``` python import colorsys r, g, b = 255, 0, 0 h, s, v = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0) print(h, s, v) #输出为 (0.0, 1.0, 1.0) ``` 2. HSVRGBHSVRGB化可以用colorsys模块中的hsv_to_rgb()函数来实现,函数的参数为HSV三元组,返回值为RGB三元组。 具体的代码如下: ``` python import colorsys h, s, v = 0.0, 1.0, 1.0 r, g, b = colorsys.hsv_to_rgb(h, s, v) print(r, g, b) #输出为 (1.0, 0.0, 0.0) ``` 需要注意的是,colorsys模块中的RGBHSV值的取值范围均为0~1,因此在化时需要将RGB的数值除以255,以便将RGB值的取值范围化为0~1。 以上就是在python实现RGBHSV转换的方法,通过这些方法我们可以方便的实现在不同颜色表示方法之间的转换,应用于图像处理,色彩识别等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值