1

一段时间以来,我一直在为一个小问题苦苦挣扎,只是不知道出了什么问题。

所以我有一个黑色的 126 x 126 图像,带有 1 像素的蓝色边框( [B,G,R] = [255, 0, 0] )。我想要的是距离所有蓝色像素(例如边框)最远的像素。我明白这是怎么做到的。遍历每个像素,如果它是黑色的,则计算到每个其他蓝色像素的距离,寻找最小值,然后选择与任何蓝色的最小距离最大的黑色像素。

注意:我不需要真正知道真实的距离,所以在计算距离的平方和时我不求平方根,我只想知道哪个距离更大(更便宜)。

我要做的第一件事是遍历每个像素,如果它是蓝色的,则将行和列添加到向量中。我可以确认这部分工作正常。接下来,我再次遍历所有像素,并将每个黑色像素的距离与蓝色像素向量中的每个像素进行比较。

其中蓝色是蓝色对象的向量(具有行和列)区域是图像

int distance;
int localShortest = 0;
int bestDist = 0;
int posX = 0;
int posY = 0;

for(int i = 0; i < image.rows; i++)
{
    for(int j = 0; j < image.cols; j++)
    {
        //Make sure pixel is black
        if(image.at<cv::Vec3b>(i,j)[0] == 0
            && image.at<cv::Vec3b>(i,j)[1] == 0 
            && image.at<cv::Vec3b>(i,j)[2] == 0)
        {
                for(int k = 0; k < blue.size(); k++)
                {
                    //Distance between pixels
                    distance = (i - blue.at(k).row)*(i - blue.at(k).row) + (j - blue.at(k).col)*(j - blue.at(k).col);

                    if(k == 0)
                    {
                        localShortest = distance;
                    }

                    if(distance < localShortest)
                    {
                        localShortest = distance;
                    }
                }

            if(localShortest > bestDist)
            {
                posX = i;
                posY = j;
                bestDistance = localShortest;

            }
       }
    }
}

这对于边缘周围的 1 像素边框非常有效。 https://dl.dropboxusercontent.com/u/3879939/works.PNG

同样,如果我添加更多蓝色但保留一个方形的黑色区域,那么它也可以工作。 https://dl.dropboxusercontent.com/u/3879939/alsoWorks.PNG

但是一旦我使图像没有方形黑色部分,而可能是矩形。然后“最远”关闭。有时它甚至说蓝色像素离蓝色最远,这是不对的。

https://dl.dropboxusercontent.com/u/3879939/off.PNG

非常感谢任何帮助!有点伤我的头。

4

3 回答 3

3

鉴于您无论如何都在使用 OpenCV,一种可能性是仅使用提供的距离变换函数

对于您的特定情况,您需要执行以下操作:

  1. 将您的输入转换为单通道二值图像(例如,将黑色映射为白色,将蓝色映射为黑色)
  2. 使用(欧几里得距离)运行cv::distanceTransform函数CV_DIST_L2
  3. 检查生成的灰度图像以获得结果。

请注意,距离边界的最大距离可能有多个像素,因此您需要根据您的应用程序处理这种情况。

距离变换中最亮的像素将是您需要的像素。例如,这是一个白色矩形及其距离变换:

例子

于 2013-10-31T08:39:48.973 回答
2

在正方形中,由于其对称性,最远的黑点(中心)也是最远的,无论您从那里往哪个方向看。但现在试着想象一个高度很短的很长的矩形。它的水平轴上会有多个点,到它们的最大最小距离将是到顶部和底部的短距离,因为左侧和右侧距离很远。在这种情况下,您的算法找到的像素可以是这条线上的任何一个像素,结果将取决于您的像素扫描顺序。

于 2013-10-31T08:55:23.943 回答
0

这是因为有一条线(超过一个像素)可以满足您的矩形条件

于 2013-10-31T08:24:17.953 回答