一段时间以来,我一直在为一个小问题苦苦挣扎,只是不知道出了什么问题。
所以我有一个黑色的 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
非常感谢任何帮助!有点伤我的头。