尝试在没有opencv calcHist()的情况下计算我自己的直方图
Trying to compute my own Histogram without opencv calcHist()
我要做的是编写一个函数,该函数计算灰度图像的直方图,其中包含转发的箱数(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;
}
相关文章:
- 如何在不使用乘除运算符的情况下计算 A 的 B 次幂?
- C++在不使用pow或循环的情况下计算一个数字的幂
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 在没有查找表的情况下计算大数的位长度
- 在不创建子矩阵的情况下计算C++矩阵的行列式
- 如何在不使用提取操作员的情况下计算TXT文件中的数量数
- 在不损失C++或 Python 性能的情况下计算 pi
- 如何在不使用loop或std :: comguate()的情况下计算向量的总和
- 程序不会降低最低分数并在没有它的情况下计算平均值
- 如何遍历二叉树并在不传递值的情况下计算值的出现次数
- 在不使用 strlen() 的情况下计算字符串中的字母
- 在没有外部库的情况下C++计算大量数字
- 尝试在没有opencv calcHist()的情况下计算我自己的直方图
- 如何在没有数学的情况下计算第 n 个根
- 在不使用函数 pow 的情况下计算表达式的总和
- 我无法弄清楚如何在不使用 climits 的情况下计算最大和最小有符号数C++
- 在不模板的情况下计算另一个类的动态函数指针
- 在不切割变量的情况下计算双精度
- 在不能存储值的情况下计算序列
- 如何在没有数学函数(arctan)的情况下计算point和org(0,0)之间的快速路径角(最接近八个提供值之一)