颜色理论与实验(OpenCV)


内容仅作记录。

1. 理论部分

1.1 光谱图


颜色 波长 λ 频率 f
红色 约 625 ~ 740 nm 约 480 ~ 405 THz
橙色 约 590 ~ 625 nm 约 510 ~ 480 THz
黄色 约 565 ~ 590 nm 约 530 ~ 510 THz
绿色 约 500 ~ 565 nm 约 600 ~ 530 THz
蓝色 约 485 ~ 500 nm 约 620 ~ 600 THz
靛色 约 440 ~ 485 nm 约 680 ~ 620 THz
紫色 约 380 ~ 440 nm 约 790 ~ 680 THz

1.2 三原色

  • 光学三原色(RGB): 红、绿、蓝。光学三原色混合后,组成显示屏显示颜色,三原色同时相加为白色,白色属于无色系(黑白灰)中的一种。

(红)+(绿)=(黄)= (白) - (蓝)
(蓝)+(绿)=(青)= (白) - (红)
(红)+(蓝)=(品红)= (白) - (绿)
(绿)+(蓝)+(红)=(白)

黄色、青色、品红都是由两种及色相混合而成,所以它们又称相加二次色。


光学三原色(加法混色)

  • 颜料三原色(CMYK): 品红、黄、青。颜料三原色可以混合出所有颜料的颜色,同时相加为黑色,黑白灰属于无色系。

(青)+(品红)=(蓝)= (黑)-(黄)
(品红)+(黄)=(红)= (黑)-(青)
(黄)+(青)=(绿)= (黑)-(品红)
(青)+(品红)+(黄)=(黑)


颜料三原色(减法混色)

1.3 颜色空间

  • RGB彩色空间: 包含红(Red)、绿(Green)、蓝(Blue)三个分量;
  • NTSC彩色空间: NTSC在美国用于电视系统,包含亮度(Y)、色调(I)、饱和度(Q)三个分量;
  • YCbCr彩色空间: YCbCr彩色空间广泛应用与数字视频,包含亮度(Y)、蓝色分量和一个参考值的差(Cb)、红色分量和一个参考值的差(Cr)三个分量;
  • HSL、HSV(HSB)彩色空间: 包含色调(Hue)、饱和度(Saturation)、亮度(Lightness)、数值/明度(Value, Brightness)分量;
  • CMY、CMYK彩色空间: 包含青(C)、品红(M)、黄(Y)、黑(K)分量,通常用于印刷,为生成纯正的黑色,添加黑色分量;
  • HSI彩色空间: 包含色度(Hue)、饱和度(saturation)、亮度(intensity)三个分量;


RGB色彩立方体


CMYK色彩立方体


HSL和HSV色彩模型


HSI色彩模型

1.4 颜色空间转换

1.4.1 RGB与NTSC互转

转换 计算公式
RGB2NTSC
NTSC2RBG

1.4.2 RGB与NTSC互转

转换 计算公式
RGB2YCbCr

1.4.3 RGB与CMY互转

转换 计算公式
RGB2CMY

1.4.4 RGB与HSI互转

转换 计算公式
RGB2HSI
HSI2RBG
HSI2RBG
HSI2RBG

2. 实验部分

2.1 提取中间绿色区域

    cv::Mat img;
    if (srcimg.channels() == 3) {
        cv::Mat bgr[3];
        cv::split(srcimg, bgr);
        //img = bgr[2]; 
        img = bgr[1] - bgr[2];
        cv::imwrite("D:/debug/img.bmp", img);
        cv::imwrite("D:/debug/bgr0.bmp", bgr[0]);
        cv::imwrite("D:/debug/bgr1.bmp", bgr[1]);
        cv::imwrite("D:/debug/bgr2.bmp", bgr[2]);
    }
    else {
        img = srcimg;
    }
src b g r g - r

2.2 提取中间圆孔

如上图,基于R通道,阈值化后找霍夫圆

    //找霍夫圆
    std::vector cir;
    cv::HoughCircles(img, cir, cv::HOUGH_GRADIENT, 1, 10, 100, 30, 10, 30);
    //srcimg.copyTo(dstimg);

    cout << "检测到了 " << cir.size() << " 个圆!" << endl;
    for (size_t i = 0; i < cir.size(); i++) {
    	cv::Vec3f cc = cir[i];
    	cout << "第 " << i << " 个圆的圆心和半径分别为: " << cv::Point(cc[0], cc[1]) << " 和" << cc[2] << endl;
    	circle(dstimg, cv::Point(cc[0], cc[1]), cc[2], cv::Scalar(255, 255, 0), 2, cv::LINE_AA);
    	circle(dstimg, cv::Point(cc[0], cc[1]), 1, cv::Scalar(255, 255, 0), 2, cv::LINE_AA);
    }
    cv::imwrite("D:/debug/circle_all.bmp", dstimg);


examples

参考资料

[1] R.C.冈萨雷斯, P.温茨. 数字图象处理[M]. 科学出版社, 1981.
[2] https://ws.wiki.fallingwaterdesignbuild.com/wiki/颜色
[3] https://baike.baidu.com/item/三原色/764849?fr=aladdin
[4] http://adobephotoshop.blog.hexun.com/15935542_d.html