本文有两个函数一个是changeclass和intrans,changeclass是为了转换图像的类型
function image = changeclass(class, varargin)
%将图像varargin转换为class类型
switch class
case 'uint8'
image = im2uint8(varargin{:});
case 'uint16'
image = im2uint16(varargin{:});
case 'double'
image = im2double(varargin{:});
otherwise
error('Unsupported IPT data class.');
end
function g = intrans(f,varargin)
% g = intrans(f,'neg') 输出为输入图片的负片
%
% g = intrans(f,'log',c,class) 对图像进行log变换(公式为:g =
% c*log(1+double(f))),c的默认值为1。class为指定输出的图像类型,默认为与输入图像一致
%
% g = intrans(f,'gamma',gam)
% 如果gam是小于1,该映射是偏重于高(亮)的输出值。如果gam大于1,该映射是偏向低(暗)的输出值。
%
% g = intrans(f,'stretch',m,e) 公式为(g =1./(1+(m./(f+eps)).^E))。
% 可以不输人m与e,默认m为图像的平均值,e为4
% 对比度拉伸变换函数。该函数可以将输入值低于m的灰度级压缩为输出图像中较暗灰度级的较窄范围内;
% 类似的,可以将输入值高于m的灰度级压缩到为输出图像中较亮灰度级的较窄范围内。输出的是有较高对比度的图像。
error(nargchk(2,4,nargin))%判断参数的正确性
classin = class(f);%输入图像的类型
if strcmp(class(f),'double') && max(f(:))>1 && ...
~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
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 = imsdjust(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);
函数本人亲测
这是对比度的测试结果:
最后还有一个函数:
function g = gscale(f,varargin)
% g = gscale(f,method,low,high)
% f为将被标度的图像,method的有效值为‘full8’和‘full16’,前者将输出标度为全范围【0,255】,后者为【0,65535】。
% method的第三个有效值为‘minmax’,此时必须给定low和high的值且必须在范围【0,1】内。映射的结果则会在【low,high】内。
if isempty(varargin)
method = 'full8';
else
method = varargin{1};
end
switch method
case 'full8'
g = im2uint8(mat2gray(double(f)));
case 'full16'
g = im2uint16(mat2gray(double(f)));
case 'minmax'
low = varargin{2};high = varagin{3};
if low>1||low<0||high>1||high<0
error('Parameters low and high must be in the range [0,1].')
end
if strcmp(class(f),'double')
low_in = min(f(:));
high_in = max(f(:));
elseif strcmp(class(f),'uint8')
low_in = double(min(f(:)))./255;
high_in = double(max(f(:)))./255;
elseif strcmp(class(f),'uint16')
low_in = double(min(f(:)))./65535;
high_in = double(max(f(:)))./65535;
end
g = imadjust(f,[low_in high_in],[low high]);
otherwise
error('Unknown method.')
end
函数参考冈萨雷斯的数字图象处理matlab版