伪彩色编码 matlab实现
中南大学
医学图像处理实验报告
A color coding method
彩色编译方法
中南大学生物医学工程系
生物医学工程1101班
指导老师:喻罡
作者:文勋喆
2014年5月4日
伪彩色增强
人的生理视觉系统特性对微小的灰度变化不敏感,而对彩色的微小差别极为敏感。人眼一般能够区分的灰度级只有二十几个,而对不同亮度和色调的彩色图像分辨能力却可达到灰度分辨能力的百倍以上。
利用这个特性人们就可以把人眼不敏感的灰度信号映射为人眼灵敏的彩色信号,以增强人对图像中细微变化的分辨力。彩色增强就是根据人的这个特点,将彩色用于图像增强之中,在图像处理技术中彩色增强的应用十分广泛且效果显著。常见的彩色增强技术主要有假彩色增强及伪彩色增强两大类。
伪彩色则是把一幅黑白域图像的不同灰度级映射为一幅彩色图像的技术手段称做伪彩色增强。
1.灰度分层法伪彩色处理
灰度分层法又称为灰度分割法,是伪彩色处理技术中最基本、最简单的方法。设一幅灰度图像f(x,y),可以看成是坐标(x,y)的一个密度函数。把此图像的灰度分成若干等级,即相当于用一些和坐标平面(即x-y平面)平行的平面在相交的区域中切割此密度函数。
2.灰度变换法伪彩色处理
这种变换方法是先将f(x,y)灰度图像送入具有不同变换的红绿蓝变换器,
然后再将三个变换器的不同输出分别分别送到彩色显像管的红绿蓝电子枪。
论文解读
1.标准(Criteria)
A.点色度排列序原则按增亮度的顺序;
B.色调的选择应按从固有暗色调到固有亮色调的方式来选择Black→ dark blue → magenta → orange → yellow → white C.避免过多饱和度,没有色彩能从RGB中的两个组成。
2.过程(Procedure)
A.将16步长的层用程序设置好,视觉调到整体平衡;
B.CIELVU:(u,v,L*)
(u,v)表示光的色度,包括色调,饱和度;
L*表示光的强度(在屏幕上为一个界定的区域);
u, v, L*可由rgb值计算而来。
3.原型色彩刻度(Prototype Color Scale)
Gray level 到R, G, B level的映射。
4.与设备无关的色彩级定义(Device independent definition)
一点的宽度在VDU屏上不是关于r,g,b线性相关的,所以用与设备无关的变量来表示(CIE);
Y在白端点归一为100cd/m2;
色调:X to Y;
饱和度:Z to Y。
5.比色计算(Colorimetric calculation)
6.彩色域的滤波
实验中加入了彩色域的滤波;
RGB图像相当于三个红、绿、蓝图像叠加产生的图像,滤波可以发生在各个图像上,然后将滤波后的图像相加;也可以直接在RGB 图上进行滤波。
实验结果
*实验还对Matlab自带的工具箱函数进行了试验,残生了基于不同颜色变换的伪色彩变换:
g = grayslice(f,16); %原灰度图分成16个层次
Example:
I = imread(‘image.jpg');
X = grayslice(I,16);
imshow(I)
figure, imshow(X,jet(16))
伪色彩编码路径结果:
Hot:Black→Red→Yellow→white
Jet:Dark Blue→Blue→Cyan→Green→Yellow→Red→dark red
附录
程序源代码:
f= imread('2.jpg');
I=rgb2gray(f);
[m,n] = size(I);
J = double(I);
L=255;
for i = 1:m
for j = 1:n
if J(i,j) < L/16
R(i,j) = 0;
G(i,j) = 0;
B(i,j) = 0;
elseif J(i,j) < L/8
R(i,j) = 26;
G(i,j) = 16;
B(i,j) = 63;
elseif J(i,j) < 3*L/16 R(i,j) = 45;
G(i,j) = 24;
B(i,j) = 84;
elseif J(i,j) < L/4
R(i,j) = 70;
G(i,j) = 29;
B(i,j) = 103;
elseif J(i,j) < 5*L/16 R(i,j) = 98;
G(i,j) = 33;
B(i,j) = 119;
elseif J(i,j) < 3*L/8 R(i,j) = 128;
G(i,j) = 37;
B(i,j) = 132;
elseif J(i,j) < 7*L/16
R(i,j) = 160;
G(i,j) = 41;
B(i,j) = 140;
elseif J(i,j) < L/2
R(i,j) = 195;
G(i,j) = 48;
B(i,j) = 141;
elseif J(i,j) < 9*L/16 R(i,j) = 223;
G(i,j) = 65;
B(i,j) = 136;
elseif J(i,j) < 5*L/8
R(i,j) = 244;
G(i,j) = 93;
B(i,j) = 120;
elseif J(i,j) < 11*L/16 R(i,j) = 254;
G(i,j) = 126;
B(i,j) = 104;
elseif J(i,j) < 3*L/4
R(i,j) = 255;
G(i,j) = 159;
B(i,j) = 96;
elseif J(i,j) < 13*L/16 R(i,j) = 253;
G(i,j) = 190;
B(i,j) = 104;
elseif J(i,j) < 7*L/8
R(i,j) = 246;
G(i,j) = 218;
B(i,j) = 133;
elseif J(i,j) < 15*L/16 R(i,j) = 246;
G(i,j) = 240;
B(i,j) = 188;
else
R(i,j) = 255;
G(i,j) = 255;
B(i,j) = 255;
end
end
end
new = repmat(I,[1 1 3]);
for i = 1:m
for j = 1:n
new(i,j,1) = R(i,j);
new(i,j,2) = G(i,j);
new(i,j,3) = B(i,j);
end
end
imshow(new)
fR=new(:,:,1);
fG=new(:,:,2);
fB=new(:,:,3);
w=fspecial('average');
fR_filtered=imfilter(fR,w,'replicate');
fG_filtered=imfilter(fG,w,'replicate');
fB_filtered=imfilter(fB,w,'replicate');
fc_filtered=cat(3,fR_filtered,fG_filtered,fB_filtered);
fR_medfilt2=medfilt2(fR,[10 10]);
fG_medfilt2=medfilt2(fG,[10 10]);
fB_medfilt2=medfilt2(fB,[10 10]);
fc_medfilt2=cat(3,fR_medfilt2,fG_medfilt2,fB_medfilt2);
subplot(2,2,1);imshow(f);title('?-í?')
subplot(2,2,2);imshow(new);title('2êé?±à??í???');
subplot(2,2,3);imshow(fc_filtered);title('????′|àí?á1?'); subplot(2,2,4);imshow(fc_medfilt2);title('?D?μ??2¨');