《图像处理与机器视觉》
作业
姓名:
学号:
专业:测试计量技术及仪器
时间:2016年4月
作业一:图像增强
1、图像灰度变换。
对图像(见图1)进行对比度拉伸,通过直方图获取灰度分布的最小、最大值。
图1 灰度拉伸
算法描述:
直方图均衡化是灰度变换的一个重要应用,它广泛应用在图像增强处理中。可以产生一幅灰度级分布具有均匀概率密度的图像,扩展了像素取值的动态范围。由于许多图像的灰度值是非均匀分布的,而且灰度值集中在一个小区间内的图像也是很常见的。直方图均衡化就是一种通过重新均匀地分布各灰度值来增强图像对比度的方法。直方图均衡化处理是以累积分布函数(Cumulative Distri-bution Function- CDF )为基础的直方图修改法。直方图均衡化的目的是将原始图像的直方图变为均衡分布的形式,即将一已知灰度概率密度分布的图像,经过某种变换,变成一幅具有均匀灰度概率密度分布的新图像。
源程序:
clear;clc;close;
I=imread('E:\学习\图像处理与机器视觉\灰度变换.bmp');%读取图像
[m,n,o]=size(I);
grayPic=rgb2gray(I);
figure,imshow(I);
figure,imshow(grayPic);
gp=zeros(1,256); %计算各灰度出现的概率
for i=1:256
gp(i)=length(find(grayPic==(i-1)))/(m*n);
end
figure,bar(0:255,gp);
title('原图像直方图');
xlabel('灰度值');
ylabel('出现概率');
newGp=zeros(1,256); %计算新的各灰度出现的概率
S1=zeros(1,256);
S2=zeros(1,256);
tmp=0;
for i=1:256
tmp=tmp+gp(i);
S1(i)=tmp;
S2(i)=round(S1(i)*256);
end
for i=1:256
newGp(i)=sum(gp(find(S2==i)));
end
figure,bar(0:255,newGp);
title('均衡化后的直方图');
xlabel('灰度值');
ylabel('出现概率');
newGrayPic=grayPic; %填充各像素点新的灰度值
for i=1:256
newGrayPic(find(grayPic==(i-1)))=S2(i);
end
figure,imshow(newGrayPic);
处理结果及分析:
运行以上代码后,matlab出来的图像如下图1.1和图1.2所示:
图1.1 原图像及其直方图
图1.2 直方图均衡化后的图像及其直方图
从上图中可以看出,图像灰度的最大值为250,最小为0,用直方图均衡化后,图像的直方图的灰度间隔被拉大了,均衡化的图像的一些细节显示了出来,这有利于图像的分析和识别。直方图均衡化就是通过变换函数histeq将原图的直方图调整为具有“平坦”倾向的直方图,然后用均衡直方图校正图像。
2、(选作)设计K近邻均值(中值)滤波器,给出图像(见图)处理结果。
1) 以待处理像素为中心,作一个m*m的作用模板。
2)在模板中,选择K个与待处理像素的灰度差为最小的像素。
3)将这K个像素的灰度均值(中值)替换掉原来的像素值。
图2 图像滤波
算法描述:
邻近均值滤波,即中值滤波(Median filtering)是一种非常有用的非线性信号处理方法,在一定程度上可以克服采用诸如邻域均值滤波等线性低通滤波器消除
噪声时,会将图像边缘模糊掉的缺点。中值滤波尤其对图像中的脉冲噪声、扫描噪声等能有良好的去除效果,但是对含有过多细节的图像,处理效果一般不好。
中值滤波器根据器计算方法,可以称为非线性滤波器中的排序统计滤波器,它不是简单的加权求和,而是先把邻域像素按灰度级进行排序,然后再选择该组的中值作为模板输出结果。由于中值滤波在算法设计上使与周围像素灰度级相差较大的点处理后能和周围的像素值比较接近,因此可以衰减随机噪声,尤其是脉冲噪声等。但由于不是简单的取均值,因此产生的模糊要少得多。
图2.1为中值滤波器得一维应用示例,其中图(a)为一叠加有1/4采样频率正弦震荡得离散信号序列,在3点邻域中进行中值滤波,在得到得处理结果(b)中,完全消除了正弦波的干扰,而且保留了边界。
(a)(b)
图2.1 中值滤波
中值滤波由于需要对邻域所有像素按灰度级进行排序之后得到模板输出结果,因此在计算速度上要比模板卷积慢。为了加快处理速度,在程序设计时采用“冒泡”排序法排序。
选用函数medfilt2,b=medfilt2(a,[m,n]);b是中值滤波后的图象矩阵,a是原图矩阵,m和n是处理模版大小,默认3×3
源程序:
clear;clc;close;
%medfilt2函数
Y=imread('E:\学习\图像处理与机器视觉\图像滤波.bmp');%读取图像
H=medfilt2(Y,[2 2]);
subplot(1,2,1),imshow(Y),title('原图')
subplot(1,2,2),imshow(H),title('中值滤波后的效果图');
figure,imshow(newGrayPic);
处理结果及分析:
当选2×2时,处理结果为:
图2.2 中值滤波2*2效果图当选3×3时,处理结果为:
图2.3 中值滤波3*3效果图当选7×7时,处理结果为:
图2.4 中值滤波7*7效果图
由上可知,经过中值滤波后图像变得更加清晰可见。并且函数medfilt2中,M*M选取并不是越大越好,也不是越小越好,从而要选取适当的值。
用matlab编写的中值滤波算法程序:
clear;clc;close;
X=imread('E:\学习\图像处理与机器视觉\图像滤波.bmp ');
Y=uint8(X); %把x转换成8位的无符号整形数据。
U1 = imnoise(Y,'salt & pepper', 0.02);
subplot(1,2,1),imshow(uint8(U1)),title('原图');
p=size(U1);
x1=double(U1);
x2=x1;
n=3; %模板n*n.
for i=1:p(1)-n+1
for j=1:p(2)-n+1
c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的)
e=c(1,:); %是c矩阵的第一行
for u=2:n
e=[e,c(u,:)]; %将c矩阵变为一个行矩阵
end
mm=median(e); %mm是中值
x2(i+(n-1)/2,j+(n-1)/2)=mm; %将模板各元素的中值赋给模板中心位置的元素end
end
%未被赋值的元素取原值
D=uint8(x2);
subplot(1,2,2),imshow(uint8(D)),title('中值滤波后的效果图');
处理结果如下图:
图2.5中值滤波处理效果图
从处理结果看出,用matlab函数medfilt2和自己编写的程序,能达到同样的
效果。
作业二:图像变换
1、对图像(见图)用FFT算法从空域变换到频域;显示幅度频谱,使图像能量中心移到几何中心。将图像旋转450,再显示幅度频谱。
图 3 图像变换
算法描述:
傅立叶变换是数字图像处理中应用最广的一种变换,其中图像增强、图像复原和图像分析与描述等,每一类处理方法都要用到图像变换,尤其是图像的傅立叶变换。
图像的频域增强,常用的图像增强技术可分为基于空域和基于变换域的两类方法。最常用的变换域是频域空间。在频域空间,图像的信息表现为不同频率分
量的组合。如果能让某个范围内的分量或某些频率的分量受到抑制而让其他分量不受影响,就可以改变输出图像的频率分布,达到不同的增强目的。
频域增强的工作流程:
频域空间的增强方法对应的三个步骤:
(1) 将图像f(x,y)从图像空间转换到频域空间,得到F(u,v);
(2) 在频域空间中通过不同的滤波函数H(u,v)对图像进行不同的增强,得到G(u,v)(注:不同的滤波器滤除的频率和保留的频率不同,因而可获得不同的增强效果);
(3) 将增强后的图像再从频域空间转换到图像空间,得到图像g(x,y)。 将图像由空域转换到频域,理论基础是傅里叶变换,要在数字图像处理中应用傅立叶变换,还需要解决两个问题:一是在数学中进行傅立叶变换的f(x)为连续(模拟)信号,而计算机处理的是数字信号(图像数据);二是数学上采用无穷大概念,而计算机只能进行有限次计算。通常,将受这种限制的傅立叶变换称为离散傅立叶变换(Discrete Fourier Transform ,DFT)。设{f(x)|f(0),f(1), f(2),…, f(N-1)}为一维信号f(x)的N 个抽样,其离散傅立叶变换对为:
式中:x ,u=0, 1, 2, …, N -1。
旋转图像函数imrotate ,如 J = imrotate(I,45,'bilinear','crop'); %双线性插值法旋转图像45度,并剪切图像和原图像大小一致。 源程序:
clc;clear;close;
[I,map]=imread('E:\学习\图像处理与机器视觉\图像变换.bmp'); subplot(2,2,1),imshow(I),title('图像变换原图');
J1=imrotate(I,45,'bilinear','crop'); %双线性插值法旋转图像60度,并剪切图像和原图像大小一致
)
,(v u F )
,(v u G )
,(y x f N
ux j N x
N
ux j N x
e u F N
x f u F F e x f u F x f F /2
1
1
/21
)(1
)()]([)()()]([ππ∑∑-=---==
==
=
subplot(2,2,3),imshow(J1),title('旋转图像45度');
J2=fft2(I); %fft2 函数用于数字图像的二维傅立叶变换
K1=fftshift(abs(J2)); %频谱中心化
RR1=real(K1); %取傅立叶变换的实部
II1=imag(K1); %取傅立叶变换的虚部
A1=sqrt(RR1.^2+II1.^2); %计算频谱幅值
A1=(A1-min(min(A1)))/(max(max(A1))-min(min(A1)))*225; %归一化,max(a)求矩阵a 中列最大,max(max(a))表示求a中最大元素。
subplot(2,2,2),imshow(A1),title('原图像的幅度频谱'); %显示原图像的频谱
J3=fft2(J1); %fft2 函数用于数字图像的二维傅立叶变换
K2=fftshift(abs(J3)); %频谱中心化
RR2=real(K2); %取傅立叶变换的实部
II2=imag(K2); %取傅立叶变换的虚部
A2=sqrt(RR2.^2+II2.^2); %计算频谱幅值
A2=(A2-min(min(A2)))/(max(max(A2))-min(min(A2)))*225; %归一化
subplot(2,2,4),imshow(A2),title('旋转后图像的幅度频谱'); %显示旋转图像的频谱处理结果及分析:
图3.1 图像变换处理对比图
由旋转不变性可知,如果时域中离散函数旋转45角度,则在变换域中该离散傅立叶变换函数也将旋转同样的角度。
2(选作)、已知图像为
求其2维FFT 变换F(u,v)。 源程序:
clc;clear;close; f=[0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8];
subplot(1,2,1),imshow(f,[0 255]),title('图像变换原图'); F=fft2(f);
%F=fftshift(log(1+abs(F))); %频谱中心化
subplot(1,2,2),imshow(F,[0 255]),title('傅里叶变换后图像');
处理结果及分析:
图3.2 图像变换作业二结果图
作业三:图像分割
1、采用合适方法对图像(见图4)进行边缘检测。
0102030405060708f ?????
?=??
??
??
图4 边缘检测
算法描述:
边缘检测是从图像中抽取边缘集合。
基本步骤:
去噪增强检测定位
去噪:滤波器降低噪声,但也导致边缘强度损失。
增强:突显邻域中灰度有显著变化的点,一般通过梯度幅值完成。
检测:梯度幅值较大的并不全是边缘点,确定哪些是边缘点,如梯度幅值阈值判定。
定位:精确确定边缘的位置及方向,可在子像素分辨率上来估计。
采用的检测方法有,Roberts算子定位比较精确,但由于不包括平滑,所以对于噪声比较敏感。Prewitt算子和Sobel算子都是一阶的微分算子,而前者是平均滤波,后者是加权平均滤波且检测的图像边缘可能大于2个像素。这两者对灰度渐变低噪声的图像有较好的检测效果。实际工程中,Sobel算子应用比较广泛。LOG 滤波器方法通过检测二阶导数过零点来判断边缘点。LOG 滤波器中的σ正比于低通滤波器的宽度,σ越大,平滑作用越显著,去除噪声越好,但图像的细节也损失越大,会出现边缘间断现象;σ越小,平滑作用越轻,会出现假边缘,所以要求适当选取σ。Canny方法是一阶传统微分中检测阶跃型边缘效果最好的算子之一。它比Roberts算子、Sobel算子和Prewitt算子的去噪能力都要强,能真正检测到弱边缘。缺陷:采用固定的门限,缺乏对不同图像的自适应性,自动化程度低。
源程序:
clc;clear;close;
[Y,map]=imread('E:\学习\图像处理与机器视觉\边缘检测.bmp');