首页 > 其他分享 >【计算机视觉1】--图形预处理(色彩空间转换)

【计算机视觉1】--图形预处理(色彩空间转换)

时间:2023-05-24 21:32:39浏览次数:197  
标签:val -- double cast static max 视觉 预处理 255


图像预处理

计算机视觉图像预处理是指在进行图像处理前对图像进行一系列的处理和转换,以便更好地进行后续的图像处理和分析。其主要目的是使得图像能够被计算机识别、处理和分析,同时保留尽可能多的有用信息。

图像预处理框架图

【计算机视觉1】--图形预处理(色彩空间转换)_色彩空间

今天主要讲下色彩空间转换,其他的在图像增强算法锐化算法中都有提到。

色彩空间转换

色彩空间转换是指将图像的表示方式从一个色彩空间转换为另一个色彩空间的过程。常见的色彩空间包括RGB、HSV、CMYK等。下面是几种常见的色彩空间转换方法:

RGB到HSV的转换

RGB色彩空间包含红、绿、蓝三个分量,而HSV色彩空间包含色调(Hue)、饱和度(Saturation)和值(Value)三个分量。转换方法如下:

  • 计算最大值和最小值:max_val = max(R, G, B),min_val = min(R, G, B)。
  • 计算色调(Hue):
如果max_val = min_val,则Hue = 0(定义为红色)
		如果max_val = R,则Hue = (G - B) / (max_val - min_val)
		如果max_val = G,则Hue = 2 + (B - R) / (max_val - min_val)
		如果max_val = B,则Hue = 4 + (R - G) / (max_val - min_val)
  • 计算饱和度(Saturation):
如果max_val = 0,则Saturation = 0
	否则,Saturation = (max_val - min_val) / max_val
  • 计算值(Value):Value = max_val
  • Python实现
def rgb_to_hsv(r, g, b):
    r, g, b = r / 255.0, g / 255.0, b / 255.0
    max_val = max(r, g, b)
    min_val = min(r, g, b)
    hue, saturation, value = 0, 0, 0

    # 计算色调
    if max_val == min_val:
        hue = 0
    elif max_val == r:
        hue = 60 * (0 + (g - b) / (max_val - min_val))
    elif max_val == g:
        hue = 60 * (2 + (b - r) / (max_val - min_val))
    elif max_val == b:
        hue = 60 * (4 + (r - g) / (max_val - min_val))

    # 计算饱和度
    if max_val != 0:
        saturation = (max_val - min_val) / max_val

    # 计算值
    value = max_val
  • C++实现
void RGBtoHSV(int r, int g, int b, double& h, double& s, double& v) {
    double red = r / 255.0;
    double green = g / 255.0;
    double blue = b / 255.0;

    double maxVal = std::max({ red, green, blue });
    double minVal = std::min({ red, green, blue });
    double delta = maxVal - minVal;

    // 计算色调 (Hue)
    if (delta == 0) {
        h = 0;  // 无色彩,色调为0
    }
    else if (maxVal == red) {
        h = 60 * ((green - blue) / delta);
    }
    else if (maxVal == green) {
        h = 60 * ((blue - red) / delta + 2);
    }
    else if (maxVal == blue) {
        h = 60 * ((red - green) / delta + 4);
    }

    if (h < 0) {
        h += 360;  // 调整为0到360度之间
    }

    // 计算饱和度 (Saturation)
    if (maxVal == 0) {
        s = 0;
    }
    else {
        s = delta / maxVal;
    }

    // 计算值 (Value)
    v = maxVal;
}

HSV到RGB的转换

HSV色彩空间中的色调(Hue)、饱和度(Saturation)和值(Value)可以转换为RGB色彩空间中的红、绿、蓝分量。转换方法如下:

  • 如果Saturation = 0,则R = G = B = Value
  • 否则,根据Hue的值计算对应的区间,并进行相应的计算:
将Hue乘以6得到一个角度值,记为H
	将H向下取整得到一个整数部分,记为I
	计算H减去I后的小数部分,记为F
	计算P = Value × (1 - Saturation)
	计算Q = Value × (1 - Saturation × F)
	计算T = Value × (1 - Saturation × (1 - F))
	根据I的值选择相应的计算公式计算R、G、B的值:
		如果I = 0,则R = Value,G = T,B = P
		如果I = 1,则R = Q,G = Value,B = P
		如果I = 2,则R = P,G = Value,B = T
		如果I = 3,则R = P,G = Q,B = Value
		如果I = 4,则R = T,G = P,B = Value
		如果I = 5,则R = Value,G = P,B = Q
  • Python实现
def hsv_to_rgb(h, s, v):
    if s == 0:
        r = g = b = v
    else:
        h /= 60
        i = int(h)
        f = h - i
        p = v * (1 - s)
        q = v * (1 - s * f)
        t = v * (1 - s * (1 - f))

        if i == 0:
            r, g, b = v, t, p
        elif i == 1:
            r, g, b = q, v, p
        elif i == 2:
            r, g, b = p, v, t
        elif i == 3:
            r, g, b = p, q, v
        elif i == 4:
            r, g, b = t, p, v
        else:
            r, g, b = v, p, q
  • C++实现
void HSVtoRGB(double h, double s, double v, int& r, int& g, int& b) {
    if (s == 0) {
        r = g = b = v * 255;
        return;
    }

    h /= 60;
    int i = static_cast<int>(h);
    double f = h - i;
    double p = v * (1 - s);
    double q = v * (1 - s * f);
    double t = v * (1 - s * (1 - f));

    switch (i) {
        case 0:
            r = static_cast<int>(v * 255);
            g = static_cast<int>(t * 255);
            b = static_cast<int>(p * 255);
            break;
        case 1:
            r = static_cast<int>(q * 255);
            g = static_cast<int>(v * 255);
            b = static_cast<int>(p * 255);
            break;
        case 2:
            r = static_cast<int>(p * 255);
            g = static_cast<int>(v * 255);
            b = static_cast<int>(t * 255);
            break;
        case 3:
            r = static_cast<int>(p * 255);
            g = static_cast<int>(q * 255);
            b = static_cast<int>(v * 255);
            break;
        case 4:
            r = static_cast<int>(t * 255);
            g = static_cast<int>(p * 255);
            b = static_cast<int>(v * 255);
            break;
        default:
            r = static_cast<int>(v * 255);
            g = static_cast<int>(p * 255);
            b = static_cast<int>(q * 255);
            break;
    }
}

请注意,色调应该在0到360之间,饱和度和值应该在0到1之间。返回的RGB值将在0到255之间。

RGB到CMYK的转换

RGB色彩空间中的红、绿、蓝分量可以转换为CMYK色彩空间中的青、黄、洋红、黑分量。转换方法如下:

  • 计算Cyan:Cyan = 1 - (Red / 255)
  • 计算Magenta:Magenta = 1 - (Green / 255)
  • 计算Yellow:Yellow = 1 - (Blue / 255)
  • 计算Black:Black = min(Cyan, Magenta, Yellow)
  • Python实现
def rgb_to_cmyk(r, g, b):
    r, g, b = r / 255.0, g / 255.0, b / 255.0

    k = 1 - max(r, g, b)
    if k == 1:
        return 0, 0, 0, 1

    c = (1 - r - k) / (1 - k)
    m = (1 - g - k) / (1 - k)
    y = (1 - b - k) / (1 - k)
  • C++实现
void RGBtoCMYK(int r, int g, int b, double& c, double& m, double& y, double& k) {
    double red = r / 255.0;
    double green = g / 255.0;
    double blue = b / 255.0;

    double maxVal = std::max({ red, green, blue });

    // 计算黑色分量 (Black)
    k = 1 - maxVal;

    // 避免除以0的情况
    if (k == 1) {
        c = m = y = 0;
    }
    else {
        // 计算青色分量 (Cyan)
        c = (1 - red - k) / (1 - k);
        // 计算洋红分量 (Magenta)
        m = (1 - green - k) / (1 - k);
        // 计算黄色分量 (Yellow)
        y = (1 - blue - k) / (1 - k);
    }
}

返回的CMYK分量将在0到1之间,其中0表示没有该颜色分量,1表示最大值(黑色)。请注意,对于黑色分量,值为1表示纯黑色。

以上都是常用的色彩空间转换方法,可以根据项目需求采取适合的转换方法来实现图像色彩空间的转换。

标签:val,--,double,cast,static,max,视觉,预处理,255
From: https://blog.51cto.com/u_16104273/6342981

相关文章

  • “提高微信小程序曝光率的关键策略”,让你的小程序被更多人发现!
    很高兴听到您关注微信小程序的曝光率策略。以下是一些关键策略,可以帮助提高小程序的曝光率:优化小程序SEO首先要建立一个专业、系统的SEO策略,包括小程序标题、关键词、描述等,这些关键部分可以让搜索引擎更好的了解小程序的优势和特点,同时为搜索用户提供更好的搜索结果。注重用户体验......
  • 某大厂优化中,23届瑟瑟发抖ing
    了解校招、分享校招的学长来了。昨天今天的某大厂优化传闻想必大家都有所耳闻。官方给出的解释的:正常的人力调整。只不过,这调整的动静真吓人,拿着Offer等待入职的应届生心里是在瑟瑟发抖啊。因为在应届生眼里,校招是毕业后进入大厂的一条“捷径”,也是初入职场最稳妥的方式之一。虽......
  • 《设计模式之禅》Singleton_Pattern--单例模式
    单例模式这个模式是很有意思,确实很有意思的,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝(就是那个天子)中国的历史上很少出现两个皇帝并存的......
  • OverTheWire攻关过程-Bandit模块26
    我们打开lv25-lv26,查看信息使用机器翻译从bandit25登录bandit26应该相当容易......用户bandit26的shell不是/bin/bash,而是别的东西。找出它是什么,它是如何工作的,以及如何打破它。您可能需要解决此级别的命令ssh,cat,more,vi,ls,id,pwd可以知道,可能是已登录就被踢出所以我们了解下信息登......
  • 数字类型
    在Python中,数字类型包括整型(int)、浮点型(float)和复数(complex)三种类型。整型(int):整型是Python中最基本的数字类型之一,用于表示整数。在Python中,整型可以表示任意大的整数,没有整型溢出的问题。例如:age=18#age=int(18)print(id(age))print(type(age))print(age)a......
  • NOIP2014普及组试题题解
    1.珠心算测验代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintN=2e4+39+7;intmp[N],n,a[N],ans=0;intmain(){ cin>>n; for(inti=1;i<=n;i++)cin>>a[i]; for(inti=1;i<=n;i++){ for(intj=1;j<=n;j++)......
  • pnpm install后弹错
    UncaughtSyntaxError:Therequestedmodule'/node_modules/.pnpm/[email protected][email protected]/node_modules/vue-demi/lib/index.mjs?v=b7df6023'doesnotprovideanexportnamed'hasInjectionContext'21:06:20.970"hasInjectionContext&qu......
  • 三大认证
    三大认证django转换器,配置文件作用#django转换器:django2.x以后,为了取代re_pathintstrpathuuidslug#后俩不常用实际用法:path('index/<int:id>',view.index)#django配置文件 1djagno项目要运行,优先执行配置文件的内容,做一下配置加载工作 -os.environ.setde......
  • js 中数组转树 递归方法
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"content="w......
  • AtCoder Beginner Contest 302(E,F,G)
    AtCoderBeginnerContest302(E,F,G)E(图,set)E这个题意大致为一开始给出\(n\)个点,没有一条边,后面陆续会有\(q\)次操作,以下两种方式\(1\),输入两个点,代表连接这两个点\(2\),输入一个点,意在把所有和这个点相连的边都删除每一次操作后我的都需要知道操作后还有多少个孤立无援的点(没......