gpt4 book ai didi

c++ - 尝试在没有 opencv calcHist() 的情况下计算我自己的直方图

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:29 25 4
gpt4 key购买 nike

我想做的是编写一个函数来计算灰度图像的直方图,其中转发的 Bins 数 (anzBin) 直方图范围被划分为。然后我运行图像像素以匹配它们将值分配给不同的 Bins,如果某个值适合,则将 Bin 的值增加 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. 您的 binSize 计算错误
  2. 您的分箱算法是单方面的,应该是双方面的
  3. 当您找到匹配项时,您没有增加正确的 bin

<强>1。 binsize计算

bin size = your range / number of bins

<强>2。两侧合并

if (src_pic_point[x] <= z*binSize)

您需要一个双向的值范围,而不是一个单向的不平等。假设您有 4 个 bin 和从 0 到 255 的值。您的 bin 应具有以下范围

bin     low     high
0 0 63.75
1 63.75 127.5
2 127.5 191.25
3 191.25 255

例如:值为 57应该进入 bin 0。您的代码表示该值进入所有 bin!因为它总是 <= z*binsize你需要一些有下限和上限的东西。

<强>3。增加适当的 bin

您正在使用 z遍历每个 bin,所以当你找到匹配项时,你应该增加 bin z ,除非确定它属于哪个 bin,否则不使用实际像素值

这很可能是缓冲区溢出再次假设您有 4 个 bin,并且当前像素的值为 57。此代码表示增量 bin 57。但是您只有 4 个 bin (0-3)

histogram[src_pic_point[x]]++;

你只想增加像素值落入的 bin

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;
}

关于c++ - 尝试在没有 opencv calcHist() 的情况下计算我自己的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36779920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com