【问题标题】:Trying to compute my own Histogram without opencv calcHist()尝试在没有 opencv calcHist() 的情况下计算我自己的直方图
【发布时间】:2016-04-21 20:34:44
【问题描述】:

我要做的是编写一个函数,该函数计算灰度图像的直方图,其中直方图范围被划分为转发的箱数 (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;
}

但不幸的是它不起作用...... 这里有什么问题? 请帮忙

【问题讨论】:

  • int binSize = (size.width / 256)*anzBin; binSize 0 这里是因为整数数学吗?我的意思是如果 size.width 小于 256,binSize 不会是 0?
  • 这不是我想要计算的,你是对的。我的目标是这样的: binSize = (Image()/256)*anzBin 但我该怎么做呢?
  • 将 256 替换为 256.0
  • 哦,我讨厌我自己......这将解决 binSize 问题,但我仍然有向量直方图的问题
  • 你能举一个小例子和想要的结果吗?

标签: c++ function opencv image-processing histogram


【解决方案1】:

我可以看到一些问题

  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 中!因为它总是&lt;= 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;
}

【讨论】:

  • 好的,我刚刚检查过了,它可以工作!!!非常感谢!!!这正是我一直在寻找的。祝你有美好的一天!
猜你喜欢
  • 2023-01-17
  • 2018-10-31
  • 1970-01-01
  • 2021-03-30
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
相关资源
最近更新 更多