划分 OpenCV 垫会产生意想不到的结果

Dividing OpenCV Mat gives unexpected result

本文关键字:意想不到 结果 OpenCV 划分      更新时间:2023-10-16

我正在尝试在图像和内核之间进行一些卷积,所以我的结果并不是很大,我一直在尝试将内核规范化到0到1之间的范围。我正在使用CV_32FC1垫类型,我的图像是灰度的。

我的内核从 -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 文档;divide运算符不会像你想象的那样:对于每个元素,它计算

dst(I) = saturate(scale/src2(I))

虽然您期望:

dst(I) = saturate(src2(I)/scale)

我认为你应该做:

kernel = kernel / maxVal;

(不确定这是否有效;但只要确保你有一个真正的元素划分)。