第三章第1节

目录

第二章 灰度变换与空间滤波

1.灰度变换函数

函数imadjust

函数 imadjust 是一个基本的图像处理工具箱函数,用于对灰度级图像进行灰度变换。
一般语法格式为

    g = imadjust(f,[low_in high_in],[low_out high_out],gamma)

这个函数将图像f的灰度值映射到图像g,第二个参数和第三个参数分别对应是输入输出的参数范围,low_in以下和high_in以上的值被截去,即映射为low_out和high_out,这两个参数的值都被限定在0和1之间,对于不同的数据类型,MATLAB会自动转换参数的值。
参数gamma指定映射的形状,小于1加权至较亮,大于1加权至较暗,默认值为1.即线性映射。
下面是测试代码:

>> f=imread('1.jpg');
>> g1 = imadjust(f,[0 1],[1 0]);
>> imshow(g1)
>> imwrite(g,'2.jpg');

以下分别是原图像和明暗反转后的图像:
image
image

使用函数 imcomplement 函数也可以做到类似的负片。

函数imcomplement

生成图像的负片

函数stretchlim

基本语法是

Low_High = stretchlim(f)

这个函数返回一个两元素向量,由一个低限和一个高限组成,用于实现对比度拉伸。默认情形下,Low_High中的值指定灰度级,这些灰度级充满f中底部和顶部1%的所有像素值。
利用这个函数再次生成负片,代码如下:

>> stretchlim(f)

ans =

    0.1176
    0.9333
>> g=imadjust(f,stretchlim(f),[1 0]);
>> figure , imshow(g)

处理后的图像如下:
image
可以看到,这样明显增强了负片的对比度。

对数及对比度拉伸变换

对数和对比度拉伸变换是动态规范操作的基本工具。通过如下表达式实现:
g = c*log(1 + f)
对数变换的一项主要应用是动态压缩范围。以傅里叶频谱为例,傅里叶频谱中,高值部分占优势。通过计算对数,10的6次方的动态范围会降到14左右,便于处理。下面是代码:

>> f= imread('111.jpg');
>> g = im2uint8(mat2gray(log(1 + double(f))));
>> imshow(g)

下面是原图像和效果图
image
image

指定任意灰度变换

可以用interp1函数来实现,语法为

g = interp1(z, T, f)

z,T均为列向量,f是输入图像。效果与之前函数类似。

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

函数 nargin

n = nargin

检测输入到M函数的参量数目

函数 nargout

n = nargout

检测输出参数的数量

函数 nargchk

msg = nargchk(low, high, number)

此函数在number值小于low时,返回 Not enough input arguments。在number值大于high时,返回 Too many input parameters。若number值介于low和high之间,返回一个空矩阵。
同时,使用变量varargin和varargout可以声明可变个数的参数和返回值。

自定义实现 intrans 函数

这个函数主要用来实现如下变换:负片变换,对数变换,伽马变换和对比度拉伸。
代码如下:

function g = intrans( f, method, varargin )

error(nargchk(2,4,nargin))
if strcmp(method, 'log')
    g = logTransform(f, varargin{:});
    return;
end

if isfloat(f) && (max(f(:))>1 || min(f(:)) <0)
    f = mat2gray(f);
end
[f, revertclass] = tofloat(f);

switch method
    case 'neg'
        g=imcomplement(f);
    case 'gamma'
        g=gammaTransform(f,varargin{:});
    case 'stretch'
        g=stretchTransform(f,varargin{:});
    case 'specified'
        g=spcfiedTransform(f,varargin{:});
    otherwise 
        error('错误的方法参数')
end
g=revertclass(g);

具体功能函数如下:

自定义函数 gammaTransform
function [ g ] = gammaTransform( f, gamma )
g = imadjust(f,[],[],gamma);
自定义函数 logTransform
function g = logTransform(f,varargin)
[f,revertclass] = tofloat(f);
if numel(varargin) >=2
    if strcmp(varargin{2}, 'uint8')
        revertclass = @im2unit8;
    elseif strcmp(varargin{2},'uint16')
        revertclass = @im2unit16;
    else
        error('对于log方法,输入的错误的类型')
    end
end
if numel(varargin)<1
    C=1;
else
    C=varargin{1};
end
g=C*(log(1+f));
g=revertclass(g);
自定义函数 spcfiedTransform
function g = spcfiedTransform(f, txfun)
txfun = txfun(:);
if any(txfun) >1 || any(txfun) <=0
    error('错误的txfun值')
end
T = txfun;
X = linspace(0,1,numel(T))';
g = interp1(X,T,f);
自定义函数 stretchTransform
function [ g ] = stretchTransform( f, varargin )
if isempty(varargin)
    m = mean2(f);
    E = 4.0;
elseif length(varargin) == 2
    m = varargin{1};
    E = varargin{2};
else
    error('对于stretch,输入了错误数量的参数')
end
g = 1./(1 + (m./f).^E);
自定义函数 tofloat

function [out,revertclass] = tofloat(inputimage)
%Copy the book of Gonzales
identify = @(x) x;
tosingle = @im2single;
table = {'uint8',tosingle,@im2uint8 
         'uint16',tosingle,@im2uint16 
         'logical',tosingle,@logical
         'double',identify,identify
         'single',identify,identify};
classIndex = find(strcmp(class(inputimage),table(:,1)));
if isempty(classIndex)
    error('不支持的图像类型');
end
out = table{classIndex,2}(inputimage);
revertclass = table{classIndex,3};

运行如下程序段测试

>> f  = imread('1111.jpg');
>> g=intrans(f ,'stretch',mean2(tofloat(f)),0.9);
>> imshow(g)

以下为效果图,第一张为原图,第二张为变换后的图像
image
image

函数 gscale

语法为

g = gscale(f, method, low, high)

作用为转换图像的像素值范围。

ps:这周考试有点多,进度有些慢,之后一并补上。

猜你喜欢

转载自www.cnblogs.com/magicalzh/p/9273253.html