图像处理-颜色识别-颜色格式转换

1.RGB色彩空间

概念:

  • RGB 代表 Red(红色)、Green(绿色)和 Blue(蓝色)。这三种颜色的光线混合可以生成各种颜色。

色彩表示:

  • 颜色通道:每种颜色(红、绿、蓝)通常在0到255的范围内表示,其中0表示无光(黑色),255表示最大亮度。
  • 每种颜色可以用三个值表示,例如 (255, 0, 0) 代表红色,(0, 255, 0) 代表绿色,(0, 0, 255) 代表蓝色。
  • 组合颜色:通过组合不同的RGB值,可以表示各种颜色。例如,(255, 255, 255) 表示白色,(0, 0, 0) 表示黑色,(255, 255, 0) 表示黄色。

 

 2.HSV色彩空间

概念:

  • 色相(H):表示颜色的种类。圆柱的圆周表示色相,角度越大,颜色越不同。
  • 饱和度(S):表示颜色的纯度或强度。圆柱的半径表示饱和度,从中心到圆周,饱和度从低到高。
  • 明度(V):表示颜色的亮度或强度。圆柱的高度表示明度,从底部的黑色到顶部的纯色。

 

 3.RGB与HSV格式之间的转换

        由于RGB图像中将亮度,饱和度等信息也包含在了R、G、B信息中,因此, 处理图像过程中会受到光照的影响,无法获得准确的R、G、B信息,因此需要将RGB图像转化为HSV格式图像进行处理。

  • 从HSV到RGB
    1. 计算色相对应的RGB值:
      • 如果色相在0°到60°之间,计算颜色分量:C = V * SX = C * (1 - |(H / 60°) % 2 - 1|)
      • 根据色相值调整颜色分量的顺序。
    2. 添加偏移量m到RGB值:m = V - C
    3. 计算最终的RGB值:R = (R + m) * 255G = (G + m) * 255B = (B + m) * 255
  • 从RGB到HSV
    1. 计算RGB的最大值Cmax和最小值Cmin,并计算差值Δ = Cmax - Cmin
    2. 计算明度:V = Cmax
    3. 计算饱和度:S = Δ / Cmax(如果Cmax为0,则S为0)
    4. 计算色相:
      • 如果Δ为0,则H为0
      • 根据Cmax的位置计算色相值

 4.RGB与HSV格式之间转化代码python格式

def rgb_to_hsv(r, g, b):
    r, g, b = r / 255.0, g / 255.0, b / 255.0  # Normalize RGB values to [0, 1]
    mx = max(r, g, b)
    mn = min(r, g, b)
    h = s = v = (mx + mn) / 2.0

    c = mx - mn
    if c != 0:
        if mx == r:
            h = (g - b) / c
        elif mx == g:
            h = (b - r) / c + 2
        elif mx == b:
            h = (r - g) / c + 4
        h *= 60
        if h < 0:
            h += 360
        s = 0 if mx == 0 else (mx - mn) / mx
    v = mx
    return (h, s * 100, v * 100)

def hsv_to_rgb(h, s, v):
    s /= 100.0
    v /= 100.0
    c = v * s
    x = c * (1 - abs(((h / 60) % 2) - 1))
    m = v - c
    r = g = b = 0
    if 0 <= h < 60:
        r, g, b = c, x, 0
    elif 60 <= h < 120:
        r, g, b = x, c, 0
    elif 120 <= h < 180:
        r, g, b = 0, c, x
    elif 180 <= h < 240:
        r, g, b = 0, x, c
    elif 240 <= h < 300:
        r, g, b = x, 0, c
    elif 300 <= h < 360:
        r, g, b = c, 0, x
    r = int((r + m) * 255)
    g = int((g + m) * 255)
    b = int((b + m) * 255)
    return (r, g, b)

# Example usage
rgb_color = (255, 0, 0)  # Red
hsv_color = rgb_to_hsv(*rgb_color)
print(f"RGB to HSV: {rgb_color} -> {hsv_color}")

hsv_color = (0, 100, 100)  # Red in HSV
rgb_color = hsv_to_rgb(*hsv_color)
print(f"HSV to RGB: {hsv_color} -> {rgb_color}")

1. 色彩转换: dst = cv.cvtColor(src,code) 常用的是转换成 灰度图像 cv.COLOR_BGR2GRAY HSV图像cv.COLOR_BGR2HSV YUV图像 cv.COLOR_BGR2YUV YCrCb图像 cv.COLOR_BGR2YCrCb 其中hsv里:h通道数值范围是0-180,s通道范围是0-255,v通道范围是0-255 2. import cv2 as cv import numpy as np def extrace_object_demo(): capture = cv.VideoCapture("E:/opencv/picture/donghua.avi") while(True): ret,frame = capture.read() #cv.inRange(src,阈值下限,阈值上限) #作用:提取图像在阈值中间的部分 hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV) hsv_low = np.array([100,43,46])#blue的hsv阈值 hsv_high = np.array([124, 255, 255]) mask = cv.inRange(hsv,hsv_low,hsv_high) if ret ==False: break cv.imshow("mask",mask) cv.imshow("video_window",frame) c =cv.waitKey(20) if c==27: break def color_space_demo(image): gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) cv.imshow("2",gray) hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV) cv.imshow("3",hsv) yuv = cv.cvtColor(image,cv.COLOR_BGR2YUV) cv.imshow("4",yuv) Ycrcb =cv.cvtColor(image,cv.COLOR_BGR2YCrCb) cv.imshow("5",Ycrcb) src = cv.imread("E:/opencv/picture/test1.jpg") b,g,r = cv.split(src) #cv.split 多通道图像的分离 cv.imshow("b",b) cv.imshow("g",g) cv.imshow("r",r) cv.namedWindow("1") src[:,:,2] = 0 cv.imshow("1",src) src = cv.merge([b,g,r])#cv.merge 各个通道的合并 cv.imshow("merge",src) src[:,:,2] = 0 #color_space_demo(src) extrace_object_demo() cv.waitKey(0) cv.destroyAllWindows() 总结: 1. 提取图像在阈值中间的部分,用二值化表示出来。用cv.inRange命令 cv.inRange(src,阈值下限,阈值上限) #作用:提取图像在阈值中间的部分 例如: hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV) hsv_low = np.array([100,43,46])#blue的hsv阈值 hsv_high = np.array([124, 255, 255]) mask = cv.inRange(hsv,hsv_low,hsv_high) 2. 多通道的分离与合并: cv.split(src) #cv.split 多通道图像的分离 例如 b,g,r = cv.split(src) #cv.split 多通道图像的分离 cv.imshow("b",b) cv.imshow("g",g) cv.imshow("r",r) cv.merge([b,g,r])#cv.merge 各个通道的合并 例如: src = cv.merge([b,g,r])#cv.merge 各个通道的合并 cv.imshow("merge",src)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值