Project 2:
请为视网膜OCT图像进行伪彩色渲染
以上四幅图,在我们肉眼看来是一副灰度图,那么什么叫伪彩色,什么又是渲染,需要去寻找相关资料。
四幅不同的视网膜OCT图像,在日常生活中,我们经常看到黑白的医疗图像,但是人的生理视觉系统特征对微小的灰度变化感觉不敏感,而对彩色的微小差别极为敏感,一般来说人只能分辨26个灰度级,但是对于彩色图像至少能分辨上千种色彩。利用这一特点就可以把人眼不敏感的灰度信号映射为人眼灵敏的彩色信号,以增强人对图像中细微变换的分辨率。
所以对以下视网膜图像经过伪彩色处理以后,医生将能够更加清晰地分辨出视网膜是否发生了病变或者损伤。
待解决的问题:
如何对灰色图像的每一个像素点,取得该点的灰度值并送入红、绿、蓝三个通道实施不同的变换,产生相应的红、绿、蓝的亮度值。并选择一种对人眼来说分辨的特别清楚的的映射变换方法作为伪彩色渲染。
思路及原理:
首先我们得明白什么叫伪彩色。伪彩色(Pseudo-color)就是通过一种色彩映射,把一种颜色指定给灰度图像的一个灰度级,让灰度图像也有色彩。当然,这种彩色是通过人为着色的,不是图像场景中的真实色彩,故只能叫做“伪彩色”。伪彩色图像的每个像素值实际上是一个索引值或代码,该代码值作为色彩查找表CLUT(Color Look-Up Table)中某一项的入口地址,根据该地址可查找出包含实际R、G、B的强度值。
灰度图像的伪彩色处理的原理如下:
根据色彩学方面的研究结果,将灰度图像对应到red , green , blue三个通道上,最后将三个通道的颜色值合成为需要显示的RGB颜色值即可。
灰度值与三个通道的映射关系如下图所示:
图1:灰度与红色通道映射关系
图2:灰度与绿色通道映射关系
图3:灰度与蓝色通道映射关系
接下来我通过程序来把图像的灰度值转化为这三种色道各自的色彩值,并融合在一起,就能得到我所需要的伪彩色值。另外提一点,世界上所有的色彩都是由红绿蓝(RGB)三种颜色混合得到的,每种颜色都有256个级别,所以总共有256*256*256种颜色。
编程实现:
采用Python+OpenCV等工具来实现
第一种方法:
首先导入要引用OpenCV的包和数值计算Numpy包,并读取图片大小为,并且查看了下各个点的像素值
接下来创建三个跟图像一样大小的矩阵,数值全部为零,用来存放每个像素的灰度值经过映射转化以后的RGB值。
接下来遍历灰度图中的所有像素点,对他们进行映射转化,采用原理里面的映射对应关系。得到以上代码,得到转化的结果,分别存在对应的RGB矩阵中。
最后将相应灰度图经过渲染的RGB三个通道合成为一个通道,得到显示的结果。根据人眼对图像视网膜的直观最清晰的感受调整三个映射函数,得到自己想要的结果。
第二种方法:
直接调用Python及OpenCV自带的伪彩色渲染的方法。可得到12种伪彩色渲染结果。
以上程序,将他们在窗口中显示。
在这里可以发现调用显示图像的函数太多,会让程序显得冗余和不好看,因此单独写一个显示图像的函数,设置两个形参,方便后面调用。
这样调用就显得非常简单了。
结果及分析:
以下是采用第一种方法得到的4幅渲染图的结果:
可以看到虽然相比灰度图对人眼来说效果分辨率好了很多,但还是不够突出。
但是第一种方法的优点在于你可以把灰度图像渲染成你想要的任何一种伪彩色,但是对应的效果得根据具体情况来调试更改,找到能够最清晰分辨的图,可能会耗费大量的时间。
那么采用第二种方法呢?OpenCV库中自带的几种比较经典的伪彩色渲染方法,看看效果如何,先试试第一张图。
这是第一幅图的12种结果,可以看出第三种结果的效果最好
接下来的三幅图,我就不把各自的伪彩色渲染的所有图像都放上来了。我把他们效果最好的图挑选了出来。
接下来看第二幅图,因为第三种结果最好,我就直接放上第三幅图的结果
第三幅图
第四幅图
结论:
综上所述,除了自己写的伪彩色渲染的程序,也有比较经典的几种调用伪彩色渲染的函数。自己的方法可以任意更改参数,映射函数,将有无数种转换方法。这个项目中,通过调用OpenCV自带的伪彩色渲染库发现是第三种调用的方法比较好。伪彩色图的特性是人的生理视觉系统特征对微小的灰度变化感觉不敏感,而对彩色的微小差别极为敏感,利用这一特点么就可以把人眼不敏感的灰度信号映射为人眼灵敏的彩色信号,以增强人对图像中细微变换的分辨率。因此最终结果是:
领取专属 10元无门槛券
私享最新 技术干货