我试图在图像和内核之间进行一些卷积,所以我的结果并不是很大,我一直试图将内核规范化到0到1之间的范围内预先。我正在使用CV_32FC1 Mat类型&我的图像是灰度的。
我的内核以-1到1的范围开始.I减去最小值,给出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可以存储的范围内。修复会很棒,但为什么我最感兴趣的是。
答案 0 :(得分:2)
; divide
运算符与您的想法不同:对于它计算的每个元素:
dst(I) = saturate(scale/src2(I))
你期待:
dst(I) = saturate(src2(I)/scale)
我认为你应该这样做:
kernel = kernel / maxVal;
(不确定这会起作用;但只是确保你有一个真正的元素划分)。