我正在制作图像的Correlogram。对于每个像素,相关图在一定距离范围d内找到相同颜色的像素。 Correlogram是2D矩阵,即correlogram[color][distance]
。 Correlogram的计算有点类似于直方图。
我的代码:我发布了所有计算正在进行的代码的一些主要部分。其余的代码(我没有发布)用于实现其他条件,因此没有必要。
问题:在我的最终correlogram[][]
中,有些值是" nan"。我检查了代码,但我无法找到计算/语法中的问题。
int ColorBins = 180;
int DistanceRange = 5;
double calcCorrelogram(Mat hsvImage)
{
double correlogram[ColorBins][DistanceRange];
int pixelNum[ColorBins]; //Used to count the number of pixels of same color
Mat hsvPlanes[3];
split(hsvImage, hsvPlanes);
for(int pi=0; pi<hsvImage.rows; pi++)
{
for(int pj=0; pj<hsvImage.cols; pj++)
{
int pixelColor = (int)hsvPlanes[0].at<uchar>(pi,pj);
pixelNum[pixelColor]++;
for(int d=1; d<=DistanceRange; d++)
{
int sameColorNum=0; //* number of pixels with same color in the d-distance boundary */
int totalBoundaryNum=0; //* total number of pixels in the d-distance boundary */
for(int i= pi-d, j= pj-d; j<=pj+d; j++)
{
if(i<0)
break;
if(j<0 || j>=hsvImage.cols)
continue;
int neighbourColor = (int)hsvPlanes[0].at<uchar>(i,j);
if(pixelColor == neighbourColor)
{
sameColorNum++;
}
totalBoundaryNum++;
correlogram[pixelColor][d-1] = correlogram[pixelColor][d-1] + (double)sameColorNum / (double)totalBoundaryNum;
}
}
}
for(int c=0; c<ColorBins; c++)
{
for(int d=0; d<DistanceRange; d++)
{
if(pixelNum[c] != 0)
correlogram[c][d] = correlogram[c][d] / (double)pixelNum[c];
}
}
}
答案 0 :(得分:4)
当您将零除零或乘以零无穷大时,通常会创建NaN。检查NaN和无穷大等异常数字的一种简单方法是乘以零并检查结果是否为零:
bool is_valid_double(double x)
{
return x*0.0==0.0;
}
如果x
为NaN或无穷大,则返回false。
然后,您可以使用断言来填充代码,以帮助找出出错的地方:
assert(is_valid_double(correlogram[c][d]));
一旦因断言失败而崩溃,您可以使用调试器查看程序的状态,以帮助确定发生了什么。