上期内容:医学图像处理——亮度变换函数
一般来说,MATLAB中包含了大部分我们所需要的的函数。但是我们有时侯却会想着依据自己的想法创新一些函数,遇到此种情况时我们应该怎么办呢?答案如下!
理论基础
图下所示的函数称为对比度拉伸变换函数,因为该函数可将输入值低于m的灰度级压缩为输出图像中较暗灰度级的较窄范围内,类似地,该函数可将输入值高于m的灰度级压缩为输出图像中亮度级较窄范围内。输出的是一幅具有高对比度的图像。而这种限制函数被称为阈值函数。
现在小白就来根据上面的函数编写出在matlab中的这样一个亮度变换函数(其包含拉伸函数以及以及其他常用的亮度变换方法,如上节讲到的imjust),我们这里称其为“intrans”
intrans函数编写
这里小白我直接上代码:
function g=intrans(f,varargin)
error(nargchk(2,4,nargin))
classin=class(f);
if strcmp(class(f),'double')&&max(f(:))>1&&min(f(:))<0&&strcmp(varargin{1},'log')
f=mat2gray(f);
else
f=im2double(f);
end
method=varargin{1};
switch method
case 'neg'
g=imcomplement(f);
case'log'
if length(varargin)==1
c=1;
elseif length(varargin)==2
c=varargin{2};
elseif length(varargin)==3
c=varargin{2};
classin=varargin{3};
else
errorerror (' Incorrect number of inputs for the 1og option.' )
end
g = c* (log(1 + double(f)));
case 'gamma'
if length (varargin) < 2
error('Not enough inputs for the gamma option. ')
end
gam=varargin{2};
g=imadjust(f,[],[],gam);
case 'stretch'
if length(varargin)==1
m=mean2(f);
E=4.0;
elseif length(varargin)==3
m=varargin{2};
E=varargin{3};
else error('Incorrect number of inputs')
end
g=1./(1+(m./(f+eps)).^E);
otherwise
error('Unknow enhancement method')
end
这里主要说明几点:红色部分就是输入指定部分,它规定了此函数需要输入的参数,这里就是图像f,以及一个varargin数组用来规定M和E以及所用的亮度变换方法。这里绿色的部分用来检查输入参数的数目是否有错误。接下来就是对应不同方法的亮度变换方法的撰写,由Switch函数进行跳转。这里有着“neg”--负片转换、以imjust函数为主要方法的亮度调整方法、以及我们刚才讲到的拉伸函数(蓝字部分)。主体就是这样,是不是很简单?其他的小语句就是matlab常用语句,这个相信难不倒各位小聪明!
接下来我们可以对编写的Trans函数进行使用验证一下!
f=imread("Fig0206(a).tif");
t=mean2(im2double(f));
g=intrans(f,'stretch',t,0.9);
g=im2uint8(g);
figure;
imshow(g);
小白在这里使用了stretch拉伸的方法,并传入了M、E两值(分别为t,0.9).效果图如下!
再来看看原图:
对比很清楚是不是?我们通过这样一个阈值函数拉伸处理后人体骨骼就很亮了!
小白今天的介绍就到这里啦!
内容很简单,但自己尝试一下会觉得很有意思哟,快动手试试吧!
可能会遇到bug,但不要放弃,小白也是这要改bug改出来的!