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

Trying to compute my own Histogram without opencv calcHist()

本文关键字:情况下 计算 我自己 直方图 自己的 calcHist opencv      更新时间:2023-10-16

我要做的是编写一个函数,该函数计算灰度图像的直方图,其中包含转发的箱数(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. 您的箱大小计算错误
  2. 您的分箱算法是单面的,应该是双面的
  3. 找到匹配项时,您没有增加正确的箱

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