您的位置:首页 > 编程语言

标度差值图像

2014-12-08 19:47 330 查看
标度差值图像主要应用在两张图像相减的时候,在实践中,大多数图像都是有8码显示,因此像素值在0到255之间,因此在差值图像中,像素值的取值为-255到255之间,因此在显示这一结果时需要对图像作标度。

 

方法一:

对每一个像素值再加上255,然后除以2。该方法无法保证像素的取值可以覆盖0到255的全部8比特范围,但是所有的像素一定在这一范围。另外,在除以2过程中固有的截尾误差通常将导致精确度的损失。虽然有很多的不足,但是该非常的简单方便。

 

方法二:

该方法弥补的方法一的缺点,它可以得到更高的精确度并使像素取值覆盖整个8比特的范围。我们首先提取最小值,并把它的负值加到所有的差值图像的像素中(如果最小值是-a(a>0),则加上a;如果最小值是a,则减去a;通过该操作后,差值图像中最小的值就为0了)。之后,每一个像素乘以255/Max,其中Max为上一步操作之后图像的中最大像素值,这样就将所有的像素标定到0到255的范围内。

function result = scaleImg2(source)
% scale the image(let the value between 0 and 255)
% source - the image should be scaled with double data type
%
minVal = min(source(:));
source = source - minVal;
maxVal = max(source(:));
result = uint8(source*255/maxVal);
end


下图是分别用两种方法标定后的结果,我首先是分别用方差为1 和方差10的高斯算子对图像进行滤波,然后相减得到DoG图像,由于存在负值,所以需要进行标定处理。从下图中我们可以发现,方法二的效果要比方法一好,轮空更加的明显,因为它覆盖了整个0到255的范围。



源代码下载地址

注意事项:

在matlab中,把图像读到内存是保存在uint8数据类型中,所以能够保存的值是0到255之间。如果两图像相减之后得到负值,就会把截取,保存的值为0,最后会得到错误的差值图像。为了避免这样的错误,需要在相减之前转换成double类型,然后标定之后再转换成uint8进行显示。

  

参考:

冈萨雷斯《数字图像处理》第二版  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息