cv::equalizeHist 和 matlab histeq() 有啥区别

Posted

技术标签:

【中文标题】cv::equalizeHist 和 matlab histeq() 有啥区别【英文标题】:whats the difference between cv::equalizeHist and matlab histeq()cv::equalizeHist 和 matlab histeq() 有什么区别 【发布时间】:2014-08-08 09:32:32 【问题描述】:

非常简单的问题,但我对此感到困惑。谁能解释一下 Matlab histeq() 函数和 Opencv cv::equalizeHist() 函数有什么区别吗?

由于我试图在 matlab 中对图像应用直方图均衡,但我发现结果不一样,像素的每个值存在大约 4-6 的差异。特别是一行的前 2 个像素。并且在其他像素上相差 1 或 2。 例如对于相同的图像 openCV 结果

100,160,210,240

但是 Matlab 会返回

97、159、210、240。

即使我尝试使用 histeq(image,255);或 histeq(图像,256);但甚至比它相同。有什么不同? 提前致谢。

【问题讨论】:

【参考方案1】:

这可能是因为 Matlab 使用了一个约束,该约束指定灰度变换不能超过给定强度的直方图计数之间距离的一半以上。您有更多关于 Matlab here(在页面底部,在“算法”下)和 OpenCV here 使用的算法的详细信息。

【讨论】:

感谢您的回复。好的,所以它们并不完全相同。现在我怎样才能得到类似于opencv的结果。还是我必须自己编码。 matlab中是否有内置函数或代码可用? Matlab 有一个名为FileExchange 的用户提交代码论坛。您可以在那里搜索其他实现。但实际上为什么不直接使用 Matlab 的结果呢? 我尝试在matlab中写一个opencv代码。和它一样。但结果仍然不如opencv。因此,在彻底检查了代码和所有输入和输出之后,原因之一(或 opencv inputOutputs 的差异)是这个 histeq() 函数的输出。该代码用于神经网络。所以预处理是其中的重要一步。所以我认为结果差异可能是由于预处理数据的差异.. 在应用神经网络时,这种差异是否是导致您的结果不同的原因是另一个问题,很遗憾我无法为您提供帮助。 我能理解。太感谢了。我想弄清楚。我认为目前这不是一个大问题。似乎还有其他问题......【参考方案2】:

Matlab 的 histeq 函数为您提供了几个输入选项 1) J = histeq(I, hgram) - 输出 J 将近似于用户指定的直方图和 2) J = histeq(I, n) - 输出 J 将接近默认的平面直方图,但具有 n 个离散灰度级。如果省略 n,则默认灰度级数为 64。OpenCV 的 equalizeHist(src, dst) 不提供这些选项中的任何一个;事实证明,它假设有 256 个灰度级。所以如果你尝试J = histeq(I, 256),你的结果会匹配opencv。

【讨论】:

以上是关于cv::equalizeHist 和 matlab histeq() 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV Python equalizeHist 彩色图像

OpenCV-实现直方图均衡化(对比cv::equalizeHist)

机器学习进阶-直方图与傅里叶变化-直方图均衡化 1.cv2.equalizeHist(进行直方图均衡化) 2. cv2.createCLAHA(用于生成自适应均衡化图像)

OpenCV---直方图的应用(均衡化和图像比较)

3直方图与二值化,图像梯度

Python 和 OpenCV - 改进我的车道检测算法