比较OpenCV中的强度像素值Vec3b

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

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

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


又是我 :)

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

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

  • 如果你想让彩色像素比单色像素“大”,你会更喜欢S
  • 如果你想要比较暗的像素更亮的像素,你可能会更喜欢V
  • SV任何组合都是有效的投影函数,例如S+V

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

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

    如果您使用的是Opencv,那么您可以简单地使用:

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

    你可以参考这个阅读关于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.
    
    链接地址: http://www.djcxy.com/p/89807.html

    上一篇: Compare intensity pixel value Vec3b in OpenCV

    下一篇: How to understand the average pixel number described in the frequency image?