gpt4 book ai didi

c++ - 使用opencv减去图像

转载 作者:太空狗 更新时间:2023-10-29 20:31:42 25 4
gpt4 key购买 nike

我想减去两个图像。我的问题是 cvSub() 函数饱和。我想做的是:

1) 将原始图像转换为灰度。

2) 获取灰度图像(值从 0-255)。

3) 减去图像(值从 -255 到 255)-> 使用 cvSub() 重新缩放的问题。

4) 通过乘以 0.5 并加 128 来重新缩放。

我想过把灰度图从8bit改成16bit,但是后来一切都变糟了,变成了很多行代码,最后没有成功。

最佳答案

使用 openCV,您可以执行以下操作:

  • 将两个源图像(1 和 2)缩放 0.5 倍。两张图片现在都在 [0..127] 范围内
  • 将图像 1 移动 128。它现在在 [128..255] 范围内
  • 从图像 1 中减去图像 2

这样,不需要范围转换,结果完全缩放到 8 位。使用 cvConvertScale对于前两个操作。

像这样:

//...
cvConvertScale(src1, tmp1, 0.5, 128);
cvConvertScale(src2, tmp2, 0.5, 0);
cvSub(tmp1, tmp2, dst);

编辑:

关于您对丢失信息(精度)的评论,您是对的,但在使用整数数学除法时您总是这样做。在您的情况下进行扩展就是这样。简单地认为它是将所有位向右移动一位。所以最后一点信息丢失了。

另一方面,应用操作的顺序也很重要。通过除以 2,您为每个像素引入了 0.5 的舍入(或截断)误差。如果在相减之前缩放两个输入图像,则舍入误差加起来为 1.0。这在结果图像中显示为一些像素与您使用初始方法和 Alexanders 方法获得的结果相差 1。但这是不将图像扩展到 16 位或 float 的更简单解决方案的权衡。

看这个例子:

实数:
(200 - 101)/2 = 99/2 = 49.5

Alexanders 解决方案(整数数学):
(200 - 101)/2 = 99/2 = 49

我的解决方案(整数数学):
(200/2) - (101/2) = 100 - 50 = 50

关于c++ - 使用opencv减去图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3657078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com