matlab亮度变换实用函数及说明

本文有两个函数一个是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版

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值