在数字图像处理领域,对于时空域图像的增强一般包括运用直方图均衡、亮度变换、空域平滑和锐化等方法实现对于给定图像的时空域的增强。
本文所展示的内容包括:
(1)计算并绘制图像直方图,编程实现图像的直方图均衡化处理,显示均衡前后的直方图和图像;
(2)编程实现亮度变换函数;
(3)编程实现图像的空域平滑和锐化。
数字图像时空域增强原理:
在对图像进行处理之前,了解图像整体或局部的灰度分布情况非常必要。对图像的灰度分布进行分析的重要手段就是建立图像的灰度直方图(Density Histogram),利用图像灰度直方图,可以直观地看出图像中的像素亮度分布情况;通过直方图均衡化,可以对图像的质量进行调整。
(1)生成并绘制图像的直方图
假设一幅数字图像的像素总数为N,在范围[0,G]内共有L个灰度级,其直方图定义为离散函数,其中,rk是区间[0,G]内的第K级的亮度,nk是灰度级为rk的图像中的像素数。
对于uint 8类图像,G的值为255;对于uint 16类图像,G的值为65535;对于double类图像,G的值为1.0。记住,MATLAB中的索引不能为0,故r1相当于灰度级0,r2相当于灰度级1,如此等等,rL相当于灰度级G。其中,uint 8类图像或uint 16类图像中G=L-1。
通常,会用到归一化直方图,即用所有元素h(rk)除以图像中的像素总数N所得到的图形:
P(rk)表示灰度级rk出现的频数。
MATLAB图像处理工具箱提供了imhist函数来计算和显示图像的直方图,其调用格式为:
imhist(I,b)
[COUNTS,X] = imhist(I)
其中I为输入图像,b为指定的灰度级数目,默认值为256。[COUNTS,X]=imhist(…)返回直方图统计的数据和相应的灰度级向量X。使用表达式p=imhist(I,b)/N就可简单地获得归一化直方图,这里N为图像中的像素总数。显示图像’lean.bmp’的直方图及归一化直方图,如图1所示。
(a) 原图 (b) 直方图 (c) 归一化直方图
图1 灰度图像的直方图及归一化直方图
如果图像的灰度分别集中在较窄的区间,从而引起图像细节的模糊,为了增强图像,可通过改善各部分亮度的比例关系,即通过直方图的方法来实现。这种方法是以概率论为基础的,常用的方法有直方图均衡化和直方图匹配(规定化)。
(2)直方图均衡化
直方图均衡化也叫做直方图均匀化,是将一已知灰度概率密度分布的图像,经过某种变换,变成一幅具有均匀灰度概率密度分布的新图像,此时图像的熵最大,图像所包含的信息量最大,且扩展了像元取值的动态范围,从而达到增强图像整体对比度的效果。
设一幅图像总像元数为N,灰度级的个数为L,第K个灰度级rk出现的频数为nk,则第k灰度级出现的概率为
此时变换函数可表示为
根据原图像的直方图统计值就可算出均衡化后各像元的灰度值。直方图上灰度分布较密的部分被拉伸;灰度分布较稀疏的部分被压缩,使图像对比度总体上得到增强。
MATLAB图像处理工具箱提供了直方图均衡函数histeq。其调用格式为:
J = histeq(I,n);
[J,T] = histeq(I,…);
其中,n是均衡化后的灰度级数目,是一个可选参数,缺省值是64。[J,T]=histeq(I,…)返回能从图像I的灰度直方图变换成图像J的直方图的变换函数T。显示图像’RSImg.gif’的直方图均衡化前后的图像及对应的直方图,如图2所示
(a)原图像 (b) 直方图均衡化后图像
(c) 原图的直方图 (d) 均衡化后的直方图
图2 直方图均衡化前后的图像及其直方图
经过均衡化后,原图中较暗区域中的一些细节更清晰。
(3)亮度变换函数
空域处理图像增强中,令T表示对输入图像f的一种操作,即,T可针对像素(x,y)的邻域定义;或针对一系列的输入图像(例如多幅图像按像素求和去噪)定义。
T最简单的形式1×1邻域,此时s=T(r)称为灰度级变换函数、亮度变换函数、或映射变换函数。由于对图像中某点的增强只与该点的灰度级有关,此类技术也称点处理。常用的三种基本类型函数:线性(正比,反比)、对数(对数,反对数)、幂次(n次幂,n次方根)。如图3所示。
图3 基本亮度映射函数
①反比变换(负片变换)
作用:增强嵌入于图像暗区的白色或灰色细节。
②对数变换
,c为常数。
对数变换的作用:对低灰度值的窄范围进行展宽,对高灰度值的宽范围进行压缩。对数变换使图像的低灰度值范围得以扩展;高灰度值范围得以压缩,使图像的灰度分布与人的视觉特性相匹配。另外,对数变换可压缩图像的动态范围。
反对数变换的作用:对低灰度值的宽范围进行压缩,对高灰度值的窄范围进行展宽。
③gamma变换
s=crγ,c、γ为正的常数。有偏移量时,s=c(r+ε)γ,γ>1和γ<1有相反的效果。幂次γ<1时变换的作用与对数变换类似:对低灰度值的窄范围进行展宽,对高灰度值的宽范围进行压缩,通过调节γ可以获得一族变换曲线。幂次γ >1时变换的作用与反对数变换类似:对低灰度值的宽范围进行压缩,对高灰度值的窄范围进行展宽,通过调节γ可以获得一族变换曲线。
④对比度拉伸变换
将输入值低于m的灰度级压缩为输出图像中较暗灰度级的较窄范围内;而将输入值高于m的灰度级压缩为输出图像中较亮灰度级的较窄范围内。
(4)空域平滑与锐化
空域滤波可用来对图像的某些特征进行增强,而去除其他特征。空域滤波是一种模板操作,即输出图像的某一像素值由输入图像相应的像素及其邻域的像素值决定。模板操作可看成图像和模板的卷积。而不同的滤波操作,其模板就不同。以3*3的模板为例,最简单的平滑(低通)滤波的模板为图4所示,模板乘以1/9的原因是保证输出图像仍在原来的灰度范围。锐化(高通)滤波模板的例子如图5所示,它实际上是拉普拉斯算子。这样的模板放在图像中灰度值是常数或变化很小的区域时,输出为零或很小,这样就去除了图像中的低频分量,实现图像锐化。
1/9X
图4 平滑滤波器模板
图5 锐化滤波器模板
图像的空域滤波可用MATLAB中的filter2函数实现,其语法格式如下:
Im=filter2(h,I,shape);
其中参数I是待处理的灰度图像,由imread函数读入。参数h是滤波算子(模板)。参数shape是指定滤波的范围,shape=’full’是做图像边界补零;shape=’same’是输出的图像Im和输入的图像I大小相同;shape=’valid’是不考虑边界补零,只计算有效输出部分。该参数可省略不写。
滤波模板h可以自己定义,也可调用MATLAB的fspecial函数获得,该函数语法格式如下:
h=fspecial(type,para);
参数type指定算子类型,参数para指定相应的参数,具体意义如下:
其一是type=’average’,为均值滤波器,对应参数为n,代表模板的尺寸,用向量表示,默认值为[3 3]。
其二是type=’laplacian’,为拉普拉斯算子,对应参数为alpha,用于控制算子的形状,取值范围为0到1,默认值为0.2。
其三是type=’prewit’,为Prewitt算子,用于边缘增强,无参数。
其四是type=’sobel’,为Sobel算子,用于边缘提取,无参数。
其五是type=’unsharp’,为对比度增强滤波器,对应参数为alpha,用于控制滤波器的形状,取值范围为0到1,默认值为0.2。
空域滤波例子见图6。
图6 图像空域滤波
matlab代码展示:
(1)生成并绘制灰度图像的直方图及归一化直方图
%打开一幅图像需要将图像放置到matlab所在的bin文件下才能使用imread语句打开clear all;I=imread('lena_gray_256.tif'); %打开一幅灰度图像[m,n]=size(I);p=m*n;J=imhist(I)./p; %计算图像的归一化直方图subplot(1,3,1),imshow(I);subplot(1,3,2),imhist(I,64);subplot(1,3,3),plot(J);
(2)直方图均衡化
clear all;Im=imread('region.jpg');J=histeq(Im); %均衡化subplot(2,2,1);imshow(Im);title('原图'); %显示原图subplot(2,2,2);imhist(Im);title('原图直方图'); %显示原图的直方图subplot(2,2,3);imshow(J);title('均衡化结果'); %显示均衡化后的图像subplot(2,2,4);imhist(J);title('均衡化结果的直方图'); %显示均衡化后的直方图
(3)亮度变换函数
①亮度变换的函数,可实现负片变换、对数变换、gamma变换和对比度拉伸变换。%function部分为子程序,需要添加一个函数进行调用function g = intrans(f, varargin)%INTRANS Performs intensity (gray-level) transformations.% G = INTRANS(F, 'neg') computes the negative of input image F.% % G = INTRANS(F, 'log', C, CLASS) computes C*log(1 + F) and% multiplies the result by (positive) constant C. If the last two% parameters are omitted, C defaults to 1. Because the log is used% frequently to display Fourier spectra, parameter CLASS offers the% option to specify the class of the output as 'uint8' or% 'uint16'. If parameter CLASS is omitted, the output is of the % same class as the input. % % G = INTRANS(F, 'gamma', GAM) performs a gamma transformation on% the input image using parameter GAM (a required input). %% G = INTRANS(F, 'stretch', M, E) computes a contrast-stretching% transformation using the expression 1./(1 + (M./(F +% eps)).^E). Parameter M must be in the range [0, 1]. The default% value for M is mean2(im2double(F)), and the default value for E% is 4.%% For the 'neg', 'gamma', and 'stretch' transformations, double% input images whose maximum value is greater than 1 are scaled% first using MAT2GRAY. Other images are converted to double first% using IM2DOUBLE. For the 'log' transformation, double images are% transformed without being scaled; other images are converted to% double first using IM2DOUBLE.%% The output is of the same class as the input, except if a% different class is specified for the 'log' option.% Copyright 2002- R. C. Gonzalez, R. E. Woods, & S. L. Eddins% Digital Image Processing Using MATLAB, Prentice-Hall, % $Revision: 1.7 $ $Date: /10/13 00:45:53 $% Verify the correct number of inputs.error(nargchk(2, 4, nargin))% Store the class of the input for use later.classin = class(f);% 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].if strcmp(class(f), 'double') & max(f(:)) > 1 & ...~strcmp(varargin{1}, 'log')f = mat2gray(f);else % Convert to double, regardless of class(f).f = im2double(f);end% Determine the type of transformation specified.method = varargin{1};% Perform the intensity transformation specified. switch methodcase '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.')endg = c*(log(1 + double(f)));case 'gamma'if length(varargin) < 2error('Not enough inputs for the gamma option.')endgam = varargin{2}; g = imadjust(f, [ ], [ ], gam);case 'stretch'if length(varargin) == 1% Use defaults.m = mean2(f); E = 4.0; elseif length(varargin) == 3m = varargin{2}; E = varargin{3};else error('Incorrect number of inputs for the stretch option.')endg = 1./(1 + (m./(f + eps)).^E);otherwiseerror('Unknown enhancement method.')end% Convert to the class of the input image.% g = changeclass(classin, g);g=im2uint8(g);②主程序,打开一幅灰度图像,并对其进行亮度变换。clear all;close all;f=imread('Fig0306(a)(bone-scan-GE).tif');imshow(f);g=intrans(f, 'stretch', mean2(im2double(f)), 0.9);figure; imshow(g);
(4)空域平滑与锐化
平滑:clear all;close all;f=imread('Fig0315(a)(original_test_pattern).tif');f=double(f); %转换为double类w=ones(31);figure;imshow(f);gd=imfilter(f,w);%按照默认相关,补零填充figure; imshow(gd,[]);gr=imfilter(f,w,'replicate');%通过复制外边界来扩展figure; imshow(gr,[]);gs=imfilter(f,w,'symmetric');%通过镜像反射边界来扩展figure; imshow(gs,[]);gc=imfilter(f,w,'circular');%通过二维周期函数来扩展figure; imshow(gc,[]);f8=im2uint8(f);g8r=imfilter(f8,w,'replicate');%通过二维周期函数来扩展figure; imshow(g8r,[]);
锐化:clear all;close all;f=imread('Fig0316(a)(moon).tif');imshow(f, [ ]);w=fspecial('laplacian',0);w=[0 1 0; 1 -4 1;0 1 0];g1=imfilter(f, w, 'replicate');%uint8,负数被截掉figure;imshow(g1, [ ]);f2=im2double(f);g2=imfilter(f2, w, 'replicate'); %double,负数保留figure;imshow(g2, [ ]);g=f2-g2;figure;imshow(g);
希望阅读本文的读者能够对代码进行分析学习,不要简单复制粘贴!!