我想减去两张图片.我的问题是cvSub() - 函数饱和.我想做的是:
1)将原始图像转换为灰度.
2)拍摄灰度图像(值为0-255).
3)减去图像(值从-255到255) - >使用cvSub()重新缩放的问题.
4)通过乘以0.5并添加128来重新缩放.
我想过将灰度图像从8位改为16位,但随后一切都变得更糟,它变成了许多代码行,最后它没有用完.
使用openCV,您可以执行以下操作:
这样,不需要范围转换,结果完全缩放到8位.使用cvConvertScale前两个操作.
像这样的东西:
//...
cvConvertScale(src1, tmp1, 0.5, 128);
cvConvertScale(src2, tmp2, 0.5, 0);
cvSub(tmp1, tmp2, dst);
Run Code Online (Sandbox Code Playgroud)
编辑:
对于丢失信息(精度)的评论,你是对的,但你总是在使用整数数学进行划分时.在你的情况下缩放就是这样.简单地认为它将所有位向右移动一个位置.所以最后一点信息丢失了.
另一方面,应用操作的顺序也很重要.除以2,就会0.5为每个像素引入舍入(或截断)误差.如果在减去输入图像之前缩放它们,则舍入误差加起来1.0.这会在结果图像中显示为一些像素偏离1,而初始和Alexanders方法的结果则相反.但这是更简单的解决方案的权衡,而不将图像扩展到16位或浮点.
看这个例子:
实数:
(200 - 101)/ 2 = 99/2 = 49.5
Alexanders解决方案(整数数学):(
200 - 101)/ 2 = 99/2 = 49
我的解决方案(整数数学):(
200/2) - (101/2)= 100 - 50 = 50
| 归档时间: |
|
| 查看次数: |
11710 次 |
| 最近记录: |