我要做的是编写一个函数,该函数计算灰度图像的直方图,其中包含转发的箱数(anzBin),直方图范围被划分为其中。然后,我正在运行图像像素,将它们的值与不同的箱进行比较,如果值合适,则将箱的值增加 1
vector<int> calcuHisto(const IplImage *src_pic, int anzBin)
{
CvSize size = cvGetSize(src_pic);
int binSize = (size.width / 256)*anzBin;
vector<int> histogram(anzBin,0);
for (int y = 0; y<size.height; y++)
{
const uchar *src_pic_point =
(uchar *)(src_pic->imageData + y*src_pic->widthStep);
for (int x = 0; x<size.width; x++)
{
for (int z = 0; z < anzBin; z++)
{
if (src_pic_point[x] <= z*binSize)
{
histogram[src_pic_point[x]]++;
}
}
}
}
return histogram;
}
但不幸的是它不起作用...这是怎么回事?请帮忙
我可以看到一些问题
- 您的箱大小计算错误
- 您的分箱算法是单面的,应该是双面的
- 找到匹配项时,您没有增加正确的箱
1. 箱大小计算
bin size = your range / number of bins
2. 双面分档
if (src_pic_point[x] <= z*binSize)
你需要一个双侧范围的值,而不是一个单方面的不平等。假设您有 4 个箱,值从 0 到 255。您的箱应具有以下范围
bin low high
0 0 63.75
1 63.75 127.5
2 127.5 191.25
3 191.25 255
例如:值 57
应位于 bin 0 中。您的代码说该值在所有箱中!因为它总是<= z*binsize
你需要一些有下限和上限的东西。
3. 递增相应的箱
您正在使用z
遍历每个箱,因此当您找到匹配项时,您应该递增箱z
,除非确定它属于哪个箱,否则您不使用实际像素值
这可能是缓冲区溢出 再次假设您有 4 个箱,当前像素的值为 57。此代码表示增量箱 57。但你只有 4 个箱 (0-3)
histogram[src_pic_point[x]]++;
您只想递增像素值落入的箱
histogram[z]++;
法典
考虑到这一点,这里是修订后的代码(它未经测试,但应该可以工作)
vector<int> calcuHisto(const IplImage *src_pic, int anzBin)
{
CvSize size = cvGetSize(src_pic);
double binSize = 256.0 / anzBin; //new definition
vector<int> histogram(anzBin,0); //i don't know if this works so I
//so I will leave it
//goes through all rows
for (int y = 0; y<size.height; y++)
{
//grabs an entire row of the imageData
const uchar *src_pic_point = (uchar *)(src_pic->imageData + y*src_pic->widthStep);
//goes through each column
for (int x = 0; x<size.width; x++)
{
//for each bin
for (int z = 0; z < anzBin; z++)
{
//check both upper and lower limits
if (src_pic_point[x] >= z*binSize && src_pic_point[x] < (z+1)*binSize)
{
//increment the index that contains the point
histogram[z]++;
}
}
}
}
return histogram;
}