用于灰度变换的一些实用M函数
1、处理可变数量的输入和/或输出:
函数:nargin:为检测输入到M函数的参量数目
格式:n=nargin,它返回输入到M函数的参量的实际数量
函数:nargout:用于M函数的输出
格式:n=nargout
函数:nargchk:能够在M函数体中检测传递的参量的数量是否正确
格式:msg=nargchk(low,high,number),检查number是否在low~high之间,若不在则报错,程序终止;若正确则返回一个空矩阵
例如:function G = test2(x,y,z)
……
error(nargchk(2,3,nargin));
键入>>test1(5);
由于它只有一个输入参量,不在2和3之间,所以产生错误信息,程序终止
函数varargin:具有可变个数的输入变量
函数varargout:具有可变个数的输出变量
声明 varargin 和 varargout 必须使用小写形式,
function【m, n】= test3(varargin) %接收可变数量的输入到函数test3.m中,
function 【varargout】=test4(m,n,p) %从函数test4中返回可变数量的输出,
function 【m,n】=test3(x, varargin) %
函数test3有一个固定输入参量 x ,其后跟可变数量的输入参量
当varargin作为一个函数的输入参量使用时,MATLAB将其置入一个单元数组中,该数组包含由用户提供的参量,用于包含一组混合的输入
例如:function 【m,n】=test3(varargin)
>>【m,n】=test3(f,【0 0.5 1.5】,A ,'label'); %f=一幅图像;长度为3的行向量;A=一个矩阵;'label'=一个字符串
2、另一种用于灰度变换的M函数
g=intrans(f, method,varargin)
功能:负片变换、对数变换、伽马变换、对比度拉伸
用到的函数:【g, revertclass】= tofloat(f):把一幅logical类、uint8类、uint16类或int16类的图像变成single(单精度)类的图像,
revertclass是一个函数句柄,可用于把输出转换回与f相同的类
注意学习一下函数时要注意的问题:
1、函数的选项是如何在代码的帮助部分被格式化的 ?
2、可变数量的输入是如何处理的(varargin{1}、varargin{2})
3、错误检验是如何插入代码中的(error(nargchk(2,4,nargin);error('describe the error')))
4、输出图像的类是如何与输入图像的类相匹配的 (classin=class(f);g=changeclass(classin,g))
function g=intrans(f, varargin)
error(nargchk(2, 4, nargin)) //检测函数输入参数个数是否正确
% Store the class of the input for use later.
classin = class(f); //将f的类型赋给classin
% If the input is of class double, and it is outside the range
% [0, 1], and the specified transformation is not 'log', convert the
% input to the range [0, 1].
//如果输入的图像是double类,并且灰度值的最大值大于1,第一个参数不是log,则将输入的图像矩阵归一化
if strcmp(class(f), 'double' ) & max(f(:)) > 1 & ...
~strcmp(varargin{1}, 'log')
f = mat2gray(f); //mat2gray使图像矩阵的归一化(使矩阵的每个元素的值都在0和1之间。该函数在数字图像处理中经常用到。)
else % Convert to double, regardless of class(f).
//否则将图像转变为double类型
f = im2double(f);
end
% Determine the type of transformation specified.
//确定转换前的类型
method = varargin{1};
% Perform the intensity transformation specified.
// 执行强制转换类型
switch method
//负片变换
case 'neg'
g = imcomplement(f); //
imcomplement(f):对图像f进行取反运算(负片变换)
//对数变换
case 'log'
if length(varargin) == 1 //只有一个参数
c = 1;
elseif length(varargin) == 2
c = varargin{2}; //将第二个参数的值赋给c
elseif length(varargin) == 3
c = varargin{2}; //将第二个参数的值赋给c
classin = varargin{3}; //将第三个参数的值赋给classin
else
error( 'Incorrect number of inputs for the log option.' )
end
g = c*(log(1 + double(f))); //将图像f进行对数变换
//伽马变换
case 'gamma'
if length(varargin) < 2
error( 'Not enough inputs for the gamma option.' )
end
gam = varargin{2}; //获取gama值
g = imadjust(f, [ ], [ ], gam); //伽马变换
//对比度拉伸
case 'stretch'
if length(varargin) == 1 //采取默认模式
% Use defaults.
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
% Convert to the class of the input image.
//将图像的类转换回输入的图像的类
g = changeclass(classin, g);
3、用灰度标定的M函数
提出背景:处理图像时,导致像素值跨越由负到正的较宽范围的计算,在计算过程中不会产生问题,但当利用8位或16位格式保存或观看一幅图像时,会出现问题。
我们希望把图像标度在全尺度,即最大范围【0,255】或【0,65535】
函数gscale:可以将图像标度在全尺度,此外该函数能将输出灰度级映射到一个指定的范围
格式:g = gscale(f, method, low, high)
其中f是将被标定的图像,method的有效值是'full8'(默认)和'full16',若指定了这两个值之一,则low和high将被忽略,
method的第三个有效值为'minmax',若指定了这个值,则必须提供其值在【0,1】范围内的参数low 和 high,灰度级被映射到范围【low ,high】,会根据输入类别做调整
例如:若f是uint8类,将'minmax'=【0,0.5】,则输出图像也为uint8类,其值在【0,128】范围内
若f是浮点型图像,且其值在【0,1】范围之外,则程序在运行之前会将其转换到【0,1】范围内