COLORFUL ~ ~ ~ ~ ~
用策略设计模式比较颜色
识别图像中具有某种颜色的像素
代码
我们用策略设计模式把算法封装进类
1 |
|
这样就可以通过创建类的实施来部署算法
1 | // 1. Create image processor object |
实现原理
这个算法的核心过程非常简单,只是对每个像素进行循环扫描,把它的颜色和目标颜色做比较
1 | // get the iterators |
计算与目标色的差距
1 | // Computes the distance from target color. |
用 GrabCut 算法分割图像
grabCut
函数的用法非常简单,只需要输入一幅图像,并对一些像素做上 ”属于背景“ 或 ”属于前景“ 的标记即可。根据这个局部标记,算法将计算出整幅图像的 前景/背景分割线。
一种指定输入图像局部前景/背景标签的方法是定义一个包含前景物体的矩形:
1 | Rect rectangle(5, 70, 260, 120); // 矩形外部的像素会被标记为背景 |
调用函数
1 | // define bounding rectangle |
cv::GC_INIT_WITH_RECT
使用带边框的矩形模型
1 | // Get the pixels marked as likely foreground |
cv::GC_BGD
明确属于背景的像素明确属于背景的像素(本例中矩形以外的像素)
cv::GC_FGD
明确属于前景的像素(本例中无)
cv::GC_PR_BGD
可能属于背景的像素
cv::GC_PR_FGD
可能属于前景的像素(本例中矩形之内像素的初始值)
若想要提取全部前景像素,及值为 cv::GC_FGD
或 cv::GC_PR_FGD
的像素,可以检查第一位的值
1 | result = result&1; |
这可能是因为这几个常量别定义的值为1和3,而另外两个被定义为0和2.。
转换颜色表示法
RGB颜色空间
红绿蓝组合后可以产生色域很宽的各种颜色,与人类视觉系统对应。当三种颜色强度相同时就会取得灰度。但空间并不是 感知均匀的色彩空间 ,所以计算颜色之间的差距并不是衡量两个颜色相似度的最好方法。
为了解决这一问题,引入了一些具有 感知均匀特性 的颜色表示法。
CIE L*a*b
用欧几里得距离衡量两种颜色的相似度。
在 process 方法中先把输入图像转换成 CIE L*a*b
色彩空间
1 | cv::Mat ColorDetector::process(const cv::Mat &image) { |
转换后的变量包含颜色转换后的图像,被定义为类 ColorDetector
的一个属性
1 | class ColorDetector { |
输入的目标颜色也需要转换,需要让函数与上面的函数签名一样,即用户提供的颜色仍然是RGB格式的
1 | void setTargetColor(uchar blue, uchar green, uchar red) { |
用色调、饱和度和亮度表示颜色(HSV)
颜色空间转换
1 | // convert into HSV space |
颜色用于检测:肤色检测
mask
掩码
1 | void detectHScolor(const cv::Mat& image, // input image |
该函数的调用
1 | // detect skin tone |
- Post title:OpenCV (处理图像的颜色)
- Post author:Eva.Q
- Create time:2021-08-11 10:07:28
- Post link:https://qyy/2021/08/11/OPENCV/OPENCV1-12/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.