亮度(灰度)变换是一种非常重要的空间域内处理图像的方法,主要介绍几个亮度变换函数,以及应用。

函数简介

1.imadjust

该函数用来调整亮度,可以映射加权至更高的或更低输出值。

  • imadjust是亮度变换的基本IPT工具,语法为:
    g = imadjust(f,[low_ in high_ in],[low_ out, high_out],gamma);

  • f:输入图像;
    low_in,high_in,low_out,high_out:将low_ in,至high _ in之间的灰度值映射到low _ out,high_ out。low_ in以下的值和high _ in以上的值被剪切掉。空矩阵默认为[0 1];
    gamma:决定曲线的形状,对gamma不同的值,如下图所示,默认参数为1.
    Paste_Image.png

注意
1.除图像f外,imadjust的其他输入为[0 1],不论图像的类。若f是unit8,则函数将乘以255。
2.若是high_out小于low _out怎会输出图像反转。

2.对数和对比度拉伸变换

这两种变换时进行动态范围处理的基本工具。

对数变换

  • 实现语法:g = c*log(1+double(f));
    该函数的形状类似于gamma函数,但是gamma曲线形状可变,log不可变。
  • 主要应用:压缩动态范围
    比如傅里叶频谱的显示范围很大,高值部分占优,通过log变换可以进行压缩,便于处理。
  • 注意:期望将导致的压缩至还原为显示的全范围,以下方法实现。
    gs = im2unit8(mat2gray(g));
    mat2gray将值限定在[0,1]范围内,im2unit8将值限定在[0,255]范围内。

对比度拉伸变换

  • 实现语法:`g = 1./(1 + (m./(double(f)+eps)).^E)
    E:控制函数的斜率
    m:显示的阈值,理想条件下及变成阈值函数。
  • 主要应用:可以将输入值低于m的灰度级压缩为较暗灰度级范围内,同样,将高于m的灰度级压缩为较亮范围内。
    变换图像如图所示
    Paste_Image.png

实例分析

我们自己写一个m函数,实现多种亮度(灰度)变换的功能,同时输入变量可以放宽,通过检测输入变量的个数,来设置默认值。

function g = intrans(f,varargin)
%intrans 函数对灰度图进行变换
%   g = intrans(f,'neg')计算输入图像的负片
%   
%   g = intrans(f,'log',c,class)计算c*log(1+f)对数拉伸变换
%   后两个参数省略,c默认为1,class用于确定输出的类型为‘unit8’和'unit16',
%   如果省略,输出类型默认和输入一样
%   g = intrans(f,'ganmma',gam)对图像做伽马变换,gam为要求的输入。
%
%   
error(nargchk(2, 4, nargin));
%将输入参数的个数约束在2-4个
classin = class(f);
%存储输入的类型,用以后用;
if strcmp(class(f),'double') & max(f(:)) > 1 & strcmp(varargin{1},'log')
    f = mat2gray(f);
else %对于f的其他类型转换成double类型
    f = im2double(f);
end
%决定转换的类型
method = varargin{1};
%varargin是个单元数组
%进行确定好的转换
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 f input 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 = mat2gray(g);
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐