用于灰度变换的一些实用M函数

来源:互联网 发布:mysql关闭数据库语句 编辑:程序博客网 时间:2024/05/27 16:43


用于灰度变换的一些实用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,则将输入的图像矩阵归一化
ifstrcmp(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.  
// 执行强制转换类型
switchmethod
//负片变换
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】范围内
          

0 0