比较OpenCV

时间:2016-02-04 12:30:57

标签: c++ opencv image-processing mat

我有一个3频道Mat图片,类型为CV_8UC3。 我想在一个循环中比较像素与其邻居的强度值,然后如果邻居更大或更大则设置01。 我可以获得强度调用Img.at<Vec3b>(x,y)

但我的问题是:如何比较两个Vec3b

我应该比较每个频道的像素值(BGR或Vec3b[0]Vec3b[1]Vec3b[2]),然后将三个频道结果合并为一个Mat对象吗?

2 个答案:

答案 0 :(得分:0)

我再次:)

如果要比较(更大或更小)两个RGB值,则需要将三维RGB空间投影到平面或轴上。

当然,有很多可能做到这一点,但一个简单的方法是使用HSV色彩空间。然而,色调(H)不适合作为线性顺序函数,因为它是圆形的(即,值1.0与0.0相同,因此您无法确定0.5> 0.0或0.5 <0.0)。但是,饱和度(S)或值(V)是适合您的投影函数:

  • 如果您希望彩色像素“大于”单色像素,则您会更喜欢S
  • 如果您希望较亮的像素大于较暗的像素,则可能更喜欢V
  • SV的任意组合都是有效的投影函数,例如S+V

答案 1 :(得分:0)

据我了解,您需要一种度量来计算两个Vec3b像素之间的距离/相似度。这可以反映在n-数学空间中找到两个向量之间距离的一般问题。

其中一项着名措施(我认为这就是你所要求的),是欧几里德距离。

如果您使用的是Opencv,那么您只需使用:

cv::Vec3b a(1, 1, 1);
cv::Vec3b b(5, 5, 5);
double dist = cv::norm(a, b, CV_L2);

您可以参考this阅读有关cv :: norm及其选项的内容。

编辑:如果你这样做是为了测量颜色相似性,建议使用LAB颜色空间,因为它证明LAB空间中的欧几里德距离是人类对颜色感知的良好近似。

编辑2:我明白你的意思,为此你可以得到每个向量的大小然后比较它们,如下所示:

    double a_magnitude = cv::norm(a, CV_L2);
    double b_magnitude = cv::norm(b, CV_L2);
    if(a_magnitude > b_magnitude)
      // do something
    else
      // do something else.