Opencv 处理图像的颜色

1、用策略模式比较颜色

    策略设计模式是一种面向对象的设计模式。这种模式尽可能地将算法的复杂性隐藏在一个直观的编程借口后面,更有利于算法的部署。

    注意:在现代体系中,浮点数的欧几里得距离的计算速度比(RGB差值的绝对值)进行累加。

2、计算向量的欧几里得范数的函数

    return static_cast<int>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));

3、cv::saturate_cast函数。计算像素时会自动调用这个函数,保证像素值在0-255。

4、threshold(output,output,maxDist,255,cv::THRESH_BINARY_INV)

  这个函数通常用于将所有像素与某个阈值(第三个参数)进行比较,并在常规阈值化模式(THRESH_BINARY)下,将所有大于指定阈值的像素赋值为预定的最大值,。将其他像素赋值为0。这里用了THRESH_BINARY_INV。

一般来说,直接使用OPENCV函数,可以快速建立复杂程序,减少潜在错误,而且程序的运行效率通常也较高。不过这样做会执行很多中间步骤,消耗更多内存。

5、floodFill函数——找出与指定颜色接近的像素

    floodFill函数的做法在判断一个像素时,还要检查附近像素的状态,这是为了识别某种颜色的相关区域。用户只需要指定一个起始位置和允许的误差,就可以找出颜色相近的连续区域。

cv::floodFill(image,//输入、输出图像

Point(100,50),起始点(与这个点比较,找这个点像素的近似)

Scalar(255,255,255),填充颜色

Rect* 0,填充区域的边界矩形(绘制的颜色,这里是白色)

Scalar(35,35,35),偏差的最小、最大阈值

Scalar(35,35,35),正差阈值,两个阈值通常相等

FLOODFILL_FIXED_RANGE);与起始点像素比较

颜色接近的像素会被重新绘制成第三个参数指定的新颜色。

定义比参考色更高或更低的值作为阈值。

6、GrabCut算法分割图像

静态图像中提取前景物体,使用GrabCut算法。

Mat result;

Mat bgModel,fgModel;

grabCut(image,//输入图像

result,分割结果

rectangle,包含前景的矩形

bgModel,fgModel,模型

5,迭代次数

GC_INIT_WITH_RECT);使用矩形

这里,使用GC_INIT_WITH_RECT参数表示使用带边框的矩形模型。输入/输出的分割图像可以是以下四个值:

GC_BGD//明确属于背景的像素

GC_FGD明确属于前景的像素

GC_PR_BGD可能属于背景的像素

GC_PR_BGD可能属于前景的像素

调用这个函数之后,取得结果方式:

compare(result,GC_PR_FGD,result,CMP_EQ);

foreground(image.size(),CV_8UC3,Scalar(255,255,255);

image.copyTo(foreground,result);

实现原理:把所有未标记的像素临时标记为前景,基于当前的分类情况,算法把像素划分为多个颜色相近的组,引入前景和背景像素之间的边缘,确定背景前景的分割。在此过程中,将试图连接具有相似标记的像素,并且避免边缘出现在强度相对均匀的区域。

把问题表示成一幅连同的矩形,然后在图形上分割,以形成最优的解决方案。分割完毕后,像素会有新的标记,然后重复这个分组过程,找到最优的分割方案。

   

猜你喜欢

转载自my.oschina.net/u/4031275/blog/2978776