我正在尝试在图像和内核之间进行一些卷积,因此我的结果并不是很大,我一直在尝试事先将内核标准化到 0 到 1 之间的范围。我正在使用 CV_32FC1 Mat 类型,并且我的图像是灰度的。
我的内核从 -1 到 1 的范围开始。我减去最小值,得到 0 到 2 的范围,然后除以最大值,得到理论上应该是 0 到 1 的范围。但是,经过此除法后,值的范围变为 0 到 358。(我对这些数字进行四舍五入 - 让我知道实际的精确值是否有帮助。)
这是我的代码:
double minVal; double maxVal;
minMaxLoc(kernel, &minVal, &maxVal);
kernel = kernel - minVal;
minMaxLoc(kernel, &minVal, &maxVal);
divide(maxVal, kernel, kernel);
那么,为什么会发生这种情况呢?我觉得也许我遇到了内存或溢出问题,但我认为我的所有值都在 32F 可以存储的范围内。修复会很棒,但我最感兴趣的是原因。
最佳答案
来自 opencv documentation ; divide
运算符与您的想法不同:对于它计算的每个元素:
dst(I) = saturate(scale/src2(I))
当你期望的时候:
dst(I) = saturate(src2(I)/scale)
我认为你应该这样做:
kernel = kernel / maxVal;
(不确定这是否有效;但只需确保您有真正的元素除法)。
关于c++ - 除以 OpenCV Mat 会产生意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37479185/