第三章第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');
以下分别是原图像和明暗反转后的图像:
使用函数 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)
处理后的图像如下:
可以看到,这样明显增强了负片的对比度。
对数及对比度拉伸变换
对数和对比度拉伸变换是动态规范操作的基本工具。通过如下表达式实现:
g = c*log(1 + f)
对数变换的一项主要应用是动态压缩范围。以傅里叶频谱为例,傅里叶频谱中,高值部分占优势。通过计算对数,10的6次方的动态范围会降到14左右,便于处理。下面是代码:
>> f= imread('111.jpg');
>> g = im2uint8(mat2gray(log(1 + double(f))));
>> imshow(g)
下面是原图像和效果图
指定任意灰度变换
可以用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)
以下为效果图,第一张为原图,第二张为变换后的图像
函数 gscale
语法为
g = gscale(f, method, low, high)
作用为转换图像的像素值范围。
ps:这周考试有点多,进度有些慢,之后一并补上。