简介
人类视觉系统的一个重要特征就是能感知颜色。人眼的视网膜中有一种被称作视锥细胞的特
殊感光细胞,专门负责感知各种颜色。视锥细胞分为三种,分别负责不同波长的光线,人脑就是
通过这些细胞产生的信号来识别各种颜色的。大多数动物却只有视杆细胞,它对光线的敏感度更
高,但是覆盖了整个可见光的光谱,无法区分不同的颜色。人眼中的视杆细胞主要分布在视网膜
的边缘,而视锥细胞分布在视网膜的中心。
在数码摄影中,则是用加色法三原色(红、绿、蓝)来构建各种颜色,将它们组合起来可以
产生各种颜色,且色域很宽。实际上,选用这三种颜色也模仿了人类的颜色识别系统——人眼中
不同的视锥细胞分别负责红色、绿色和蓝色附近的光谱。本章将分析像素的颜色,并介绍如何用
颜色信息分割图像。此外,在处理彩色图像时,还可以使用其他的颜色表示法。
用策略设计模式比较颜色
策略设计模式
它是一种面向对象的设计模式,用很巧妙的方法将算法封装进类。采用这种模式后,可以很轻松地替换算法,或者组合多个算法以实现更复杂的功能。而且这种模式能够尽可能地将算法的复杂性隐藏在一个直观的编程接口后面,更有利于算法的部署。
如何实现
一旦用策略设计模式把算法封装进类,就可以通过创建类的实例来部署算法,实例通常是在程序初始化的时候创建的。在运行构造函数时,类的实例会用默认值初始化算法的各种参数,使其立即进入可用状态。我们还可以用适当的方法来读写算法的参数值。在 GUI 应用程序中,可以用多种部件(文本框、滑动条等)显示和修改参数,用户操作起来很容易。
一个部署和使用它的例子
写一个简单的主函数,调用颜色检测算法:
int main()
{
// 1.创建图像处理器对象
ColorDetector cdetect;
// 2.读取输入的图像
cv::Mat image= cv::imread("boldt.jpg");
if (image.empty()) return 0;
// 3.设置输入参数
cdetect.setTargetColor(230,190,130); // 这里表示蓝天
// 4.处理图像并显示结果
cv::namedWindow("result");
cv::Mat result = cdetect.process(image);
cv: