%intrans源程序
function g=intrans(f,varargin)
%intrans执行灰度变换
%g=intrans(f,'neg')计算图像f的负片
%g=intrans(f,'log',c,class)如果后两个参数是忽略的,则默认为1.
%因为log经常被用来展示傅里叶变换。参数的类型经常是uint8或uint16。如果参数类型被忽略,输出与输入是相同类型的。
%g=intrans(f,'gamma',gam)使用参数gam进行伽马变换
%g=intrans(f,'stretch',m,e)进行对比度拉伸变换,参数m的范围是[0,1]。m的默认值是mean2,e的默认值是4.
%对于负片变换,伽马变换,对比度拉伸变换,双精度输入图像的最大值大于1必须使用mat2gray进行缩放。其他图像先转换为double.
%对于对数变换,double图像不需要进行缩放再变换,其他类型必须先使用im2double转换为double类。
%输出与输入是相同类型的,除了指定类型是'log'.
%核实输入数的正确性
error(nargchk(2,4,nargin))
%储存输入的类型
classin=class(f);
%如果输入的类型是双精度类型,它的输出范围是[0,1]。若指定的变换不是'log',则把转化输入范围到[0,1]。
if strcmp(class(f),'double') & max(f(:))>1 & ~strcmp(varargin{1},'log')
f=mat2gray(f);
else%转换类型为double,除了f的类型
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
error('Incorrect number of inputs for the log 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 for the stretch option.')
end
g=1./(1+(m./(f+eps)).^E);
otherwise
error('Unknown enhancement method.')
end
%转换输入图像的类型
g=changeclass(classin,g);
intrans.m
最新推荐文章于 2023-10-31 17:19:20 发布