学习了数字图像图像处理一段时间,下面是我对预处理方面的一些总结。
首先,了解了预处理对数字图像有什么影响?
预处理的主要目的是消除图像中无关的信息,恢复有用的真实信息,增强有关信息的可检测性和最大限度地简化数据,从而改进特征抽取、图像分割、匹配和识别的可靠性。预处理过程一般有数字化、几何变换、归一化、平滑、复原和增强等步骤。下面是我对图像增强的总结。
图像增强有很多种方法,针对不同图像要采取不同的方法,直方图均衡化、对比度拉伸是常用到的方法,使灰度图像颜色更加分明,针对含有噪声的图像。可以采用滤波,包含平滑滤波和锐化滤波。
一、直方图处理
1、直方图均衡化
直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。
它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像原取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。直方图均衡化是一种对图像的非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
函数:histeq
实现代码如下:I=imread('2.jpg');
I=rgb2gray(I);
%K=16;
%H=histeq(I,K);
H=histeq(I);
figure,,imshow(H);
2、对比度拉伸
函数:imadjust
代码例如:
I=imadjust(I2,stretchlim(I2),[0,1]);
二、滤波法
均值滤波
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
模板有3*3、5*5、7*7三种。
实现代码如下:
clc;clear;close all;
img=rgb2gray(imread('lena1.jpg'));
figure;imshow(img);
img_noise=double(imnoise(img,'gaussian',0.006));%添加高斯噪声
figure,imshow(img_noise,[]);
img_mean=imfilter(img_noise,fspecial('average',3)); %均值模板3*3
figure;imshow(img_mean,[]);title('de-noise by mean filter');
imag_mean=exp(imfilter(log(img_noise),fspecial('average',5)));%模板5*5
figure;imshow(img_mean,[]),title('de-noise by mean filter');
Q=-1.5;
img_mean=imfilter(img_noise.^(Q+1),fspecial('average',3))./imfilter(img_noise.^Q,fspecial('average',3));
figure;imshow(img_mean,[]);title('de-noise by mean filter');
Q=1.5; img_mean=imfilter(img_noise.^(Q+1),fspecial('average',3))./imfilter(img_noise.^Q,fspecial('average',3));
figure;imshow(img_mean,[]);title('de-noise by mean filter');
中值滤波
中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
实现代码如下:
img_median=medfilt2(img_noise);%中值滤波
figure;imshow(img_median,[]);title('de-noise by median filter')%中值滤波结果;
img_median2=medfilt2(img_midian);
figure;imshow(img_median2,[]);title('de-noise by median filter');
上述两种为平滑滤波
锐化滤波
锐化用于补偿和增加图像的高频成分,使图像中的地物边界、区域边缘、线条、纹理特征和精细结构特征等更加清晰、鲜明。
利用算子prewitt、sobert、拉普拉斯算子实现
clc;clear;close all;
I=imread('lena.jpg');
%I=rgb2gray(I);
subplot(221),imshow(I); title('原图');
hs=fspecial('sobel');
S=imfilter(I,hs);
hp=fspecial('prewitt');
P=imfilter(I,hs);
A=double(I);%双精度型
H=[0 1 0,1 -4 1,0 1 0];%拉普拉斯算子
J=conv2(I,H,'same');
K=I-J;
subplot(222),imshow(J); title('拉普拉斯锐化图像');
subplot(223),imshow(S); title('sobel算子锐化图像');
subplot(224),imshow(P); title('prewitt算子锐化图像');
低通滤波(平滑)
下面为巴特沃斯低通滤波的实现代码:
clc;clear;close all;
I=imread('lena1.jpg');
I=rgb2gray(I);
figure,imshow(I);
I1=fftshift(fft2(I));
[M,N]=size(I1);
n=2;d0=30;
n1=floor(M/2);
n2=floor(N/2);
for i=1:M
for j=1:N
d=sqrt((i-n1)^2+(j-n2)^2);
H=1/(1+(d/d0)^(2*n));
I2(i,j)=H*I1(i,j);
end
end
I2=ifftshift(I2);
I3=real(ifft2(I2));
figure,imshow(I3,[]);
高通滤波(锐化)
下面代码为巴特沃斯高通滤波的实现代码:
clc;clear;close all;
f1=imread('lena1.jpg');
f1=rgb2gray(f1);
F= double(f1); % 数据类型转换,MATLAB不支持图像的无符号整型的计算
G = fft2(F); % 傅立叶变换
G = fftshift(G); % 转换数据矩阵
[M,N]=size(G);
nn = 2; % 二阶巴特沃斯(Butterworth)高通滤波器
d0 = 5;
m = fix(M/2);
n = fix(N/2);
for i = 1 : M
for j = 1 : N
d = sqrt((i-m)^2+(j-n)^2);
if (d == 0)
h = 0;
else
h=1/(1+0.414*(d0/d)^(2*nn));% 计算传递函数
end;
result(i,j) = h * G(i,j);
end;
end;
result = ifftshift(result);
J2= ifft2(result);
J3= uint8(real(J2));
subplot(121);imshow(f1); title('灰色图像');
subplot(122);imshow(J3); % 滤波后图像显示
title('滤波后的图像');
高斯滤波
部分代码:
%gaussian低通滤波
H=fspecial('gaussian',7,3);
F{2}=double(filter2(H,I));
figure,imshow(F{2},[]);
滤波部分实现代码网址
http://wenku.baidu.com/link?url=3U5MZxgxbursdIBYSVden1i8rxSxFlBaf_glnibz8Me2hG6vADZz5419XQIRlc5OrpGM8uibQI_siBwoiFvaDVPM1ewwgRV48voh7sgIoIi
http://wenku.baidu.com/link?url=esi3wmkrucc4k3lbHFtSGL2OWFMjZwz_hoB_aQQh6GiXDwxni9GFnMGhJVOWgBa6Ulm3Vf1qB0auBjKRyCY_EBKPpgMZphXeovcTRG1WyHK