这几天我在搞用contourlet变换来做图像融合。
期间,遇到了一个问题,就是将得到的多层矩阵用contourlet反变换后,得到的不是一个正规的图片矩阵,就是每个像素点灰度值大小都在0~255之间,这个矩阵像素点的灰度值有的大于了255,有的小于了0。当直接用imshow()函数来显示这个矩阵的时候,在figure窗口中画出来的完全不是一张正常图片,而是白白的一片,底部有些黑色的东西。
我查看了contourlet工具包里的各种文档说明,参考工具包里的demo程序,使用imagesc(I,[0,255])语句可以将这个矩阵显示为一张图片了,但是颜色很诡异,有点像美图秀秀加的效果,而且图像的大小也被压缩。后来查阅资料,发现imagesc()这个函数,本来就是将图片压缩后再显示的。之后添加colormap(gray);axis image;语句可以将图片显示为正常的灰度图像,图像的大小也恢复了本来面目。
那么现在问题来了,怎样将这张图片保存,然后将其用到我的其他测试函数中,来比较图像融合的效果呢?
在网上一直都找到解决方法,不过现在我已经解决这个问题啦!
其实使用imshow(I,[255])就可以将这个矩阵以正常的图片显示,而且不会像imagesc()函数有压缩图片这个副作用。同样还是上面的问题,但是怎样将figure窗口里的图片保存呢?
我参看了一下imshow()的实际函数过程,其实就是将灰度值大于255或小于0的像素直接分别修改成了255和0.那么我自己写了一个函数,对最初的矩阵进行了处理,通过遍历矩阵中的每一个像素点,将这个矩阵中灰度值大于255或小于0的像素的值直接分别修改成了255和0,得到一个新的矩阵,就是我想要的图像。
但是我之后直接用imshow(I)函数显示这个矩阵,又是一片大白。
其实还有把这个矩阵用uint8(I)变换一下,最后得到的矩阵,再用imshow(I)直接显示,就一切正常啦!
然后再用imwrite()语句保存一下这个矩阵,就得到可以用于下一步操作的图片啦!
脱水版:
step1:用imagesc(img,[l,h])显示一张图片,想保存。
step2:写一个遍历矩阵中所有像素的函数,将灰度值小于l的修改为0,将灰度值大于h的修改为255。得到矩阵img
step3:imgfinal = unit8(img).
step4:imwrite(imafinal,‘final.jpg‘,‘jpg‘)