标度差值图像

标度差值图像主要应用在两张图像相减的时候,在实践中,大多数图像都是有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进行显示。

  

参考:

冈萨雷斯《数字图像处理》第二版  



发布了24 篇原创文章 · 获赞 29 · 访问量 25万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章