目录
图像处理算法
图像处理基础
图像处理函数
默认显示方式
添加颜色条
显示多帧图像
显示动画
三维材质图像
图像的直方图
灰度变换
均衡直方图
图像处理应用
图像增强
图像重建
图像变换
图像压缩
图像分割
图像边缘检测
图像识别
图像处理算法
图像处理基础
数字图像处理技术主要包括:图像增强、图像重建、图像变换、图像压缩、图像分割、图像边缘监测和图像识别等。
(1)图像增强
①空域法:在图像所在的像素空间进行处理
②频域法:通过对图像进行傅里叶变换后再频域上间接进行的
(2)图像重建
(3)图像变换
把图像从空域转换到频域,对原图像函数寻找一个合适变换的数学问题。可分为可分离变换和统计变换两大类。
(4)图像压缩
(5)图像分割
图像分割的方法主要有两种:一种是假设图像各个成分的强度值是均匀的,并利用这个特性,这种方法的技术有直方图分割;另外一种方法是寻找图像成分之间的边界,利用的是图像的不均匀性,基于这种方法的有梯度法分割。
(6)图像边缘检测
监测图像中的线状局部结构
(7)图像识别
图像识别是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术
图像处理函数
默认显示方式
imshow – 显示图像
在图窗中显示灰度图像 I。imshow 使用图像数据类型的默认显示范围,并优化图窗、坐标区和图像对象属性以便显示图像。
imshow(I)
在图窗中显示灰度图像I
。imshow
使用图像数据类型的默认显示范围,并优化图窗、坐标区和图像对象属性以便显示图像。
imshow(I,[low high])
显示灰度图像I
,以二元素向量[low high]
形式指定显示范围。
imshow(RGB)
在图窗中显示真彩色图像RGB
。
imshow(BW)
在图窗中显示二值图像BW
。对于二值图像,imshow
将值为0
(零)的像素显示为黑色,将值为1
的像素显示为白色。
添加颜色条
GUI 可以给图像添加颜色条控件,从而通过颜色条来判断图像中的数据数值。
imshow WIN7.pngcolorbar
显示多帧图像
两种显示方式:
①在一个窗体中显示所有帧
②显示其中单独的某帧
创建多帧图像
montage – Display multiple image frames as rectangular montage. This MATLAB function displays all frames of a multiframe image array I.
load mrimontage(D,map)
单独显示第20帧
load mriimshow(D(:,:,:,20))
显示动画
movie命令从多帧图像中创建动画,但是这个命令只能处理索引图。
load mrimov = immovie(D,map);colormap(map), movie(mov)
immovie – 基于多帧图像制作影片
此 MATLAB 函数 从使用颜色图 cmap 的多帧索引图像 X 中的图像返回影片结构体数组 mov。
三维材质图像
这种三维图像是指在三维图的表面显示二维图像。warp函数的功能是显示材质图像,所使用的技术是线性插值。
[x,y,z]=sphere;A=imread('win7.png');warp(x,y,z,A)title(' win7.png')
warp(X,map)在一个简单的矩形表面上将带有颜色地图的索引图像X显示为纹理地图。
warp(I,n) 在一个简单的矩形表面上将具有n个层次的强度图像I作为纹理图显示出来。
warp(BW)将二值图像BW作为纹理图显示在一个简单的矩形表面上。
warp(RGB)将真彩色图像RGB作为纹理图显示在一个简单的矩形表面上。
warp(Z,___) 在Z面上显示图像。
warp(X,Y,Z,____)将图像显示在表面(X,Y,Z)上。h = warp(___) 返回一个到纹理映射表面的句柄。
图像的直方图
可以对RGB图、灰度图和二值图进行灰度转换,其中,灰度图和二值图的直方图表示不同。imhist
[counts,binLocations] = imhist(I)
计算灰度图像I
的直方图。imhist
函数在counts
中返回直方图计数,在binLocations
中返回 bin 位置。直方图中 bin 的数量由图像类型确定。
[counts,binLocations] = imhist(I,n)
指定用于计算直方图的 bin 的数量n
。
[counts,binLocations] = imhist(X,map)
计算具有颜色图map
的索引图像X
的直方图。对于颜色图中的每个条目,直方图中都有一个对应的 bin。
imhist(___)
显示绘制的直方图。如果输入图像是索引图像,则直方图在颜色图map的颜色条上方显示像素值分布。
I = imread('pout.tif');clear allclcI = imread('pout.tif');subplot(2,1,1),imshow(I),title('pout ');subplot(2,1,2),imhist(I),title('直方图');
灰度变换
灰度变换的主要功能是改变图像的对比度。imadjust
imadjust:调整图像强度值或颜色图
J= imadjust(I)
将灰度图像I
中的强度值映射到J
中的新值。默认情况下,imadjust
对所有像素值中最低的 1% 和最高的 1% 进行饱和处理。此运算可提高输出图像J
的对比度。
J= imadjust(I,[low_in high_in])
将I
中的强度值映射到J
中的新值,以使low_in
和high_in
之间的值映射到 0 到 1 之间的值。
J= imadjust(I,[low_in high_in],[low_out high_out])
将I
中的强度值映射到J
中的新值,以使low_in
和high_in
之间的值映射到low_out
到high_out
之间的值。
J= imadjust(I,[low_in high_in],[low_out high_out],gamma)
将I
中的强度值映射到J
中的新值,其中gamma
指定描述I
和J
中的值之间关系的曲线形状。
J= imadjust(RGB,[low_in high_in],___)
将真彩色图像RGB
中的值映射到J
中的新值。您可以为每个颜色通道应用相同的映射或互不相同的映射。
newmap= imadjust(cmap,[low_in high_in],___)
将颜色图cmap
中的值映射到newmap
中的新值。您可以为每个颜色通道应用相同的映射或互不相同的映射。
I = imread('pout.tif');J = imadjust(I, [0.3,0.7], []);subplot(2,2,1),imshow(I),title('灰度图pout');subplot(2,2,2),imhist(I), title('调整前的直方图');subplot(2,2,3),imshow(J),title('调整后的灰度图pout');subplot(2,2,4),imhist(J), title('调整后的直方图');
均衡直方图
根据图像直方图自动给出灰度变换函数,使得调整后的图像的直方图能尽可能接近预定定义的直方图,利用histeq对灰度图和索引图做直方图均衡。
J= histeq(I,hgram)
变换灰度图像I
,以使输出灰度图像J
具有length(hgram)
个 bin 的直方图近似匹配目标直方图hgram
。
J= histeq(I,n)
变换灰度图像I
,以使输出灰度图像J
具有n
个 bin 的直方图大致平坦。当n
远小于I
中的离散灰度级数时,J
的直方图更平坦。
J= histeq(I)
变换灰度图像I
,以使输出灰度图像J
的直方图具有 64 个 bin 且大致平坦。
newmap= histeq(X,map)
变换颜色图中的值,以使索引图像X
的灰度分量的直方图大致平坦。变换后的颜色图是newmap
。
newmap= histeq(X,map,hgram)
变换与索引图像X
相关联的颜色图,以使索引图像 (X
,newmap
) 的灰度分量直方图近似匹配目标直方图hgram
。histeq
函数返回变换后的颜色图newmap
。length(hgram)
必须与size(map,1)
相同。
[___,T] = histeq(___)
还返回变换T
,该变换将输入灰度图像或颜色图的灰度分量映射到输出灰度图像或颜色图的灰度分量。
I= imread('pout.tif');J = histeq(I); figure(1),subplot(1,2,1),imshow(I),title('调整前');subplot(1,2,2),imshow(J),title('调整后');
图像处理应用
图像增强
图像增强技术主要包括直方图修改处理、图像平滑化处理、图像尖锐化处理和彩色处理技术等。
%利用直方图统计算法对灰度图像进行增强clear all clcI=imread('cameraman.tif');subplot(2,2,[1,2])imshow(I);title('原始图像');subplot(2,2,3)imhist(I,64)%绘制图像的直方图,n为灰度图像灰度级; title('灰度级64的直方图');subplot(2,2,4)imhist(I,256)%绘制图像的直方图,n为灰度图像灰度级; title('灰度级256的直方图');
图像重建
利用phantom函数产生的大脑图,对于不同投影角度,重建图像。
phantom – Create head phantom image
This MATLAB function generates an image of a head phantom that can be used to test the numerical accuracy of radon and iradon or othertwo-dimensional reconstruction algorithms.P= phantom(def,n)
P是一个灰度图像,由一个大椭圆(代表大脑)组成,包含几个小椭圆(代表大脑中的特征)。 def指定要生成的头部幻影的类型,n指定幻影图像中的行和列的数量。
R= radon(I)
返回二维灰度图像I
的 Radon 变换R
,角度范围为 [0, 179] 度。Radon 变换是图像强度沿特定角度的径向线的投影。
R= radon(I,theta)
返回基于theta
所指定角度的 Radon 变换。
[R,xp] = radon(___)
返回向量xp
,其中包含与图像的每行对应的径向坐标。
iradon – 反radon变换
I = iradon(R,theta) 从R中以投影角theta捕获的投影数据重建图像I。
I = iradon(R,theta,interp,filter,frequency_scaling,output_size) 指定用于反Radon变换的参数。可以指定后四个参数的任何组合。对于你省略的参数,iradon使用默认值。
[I,H] = iradon(___) 还返回滤波器的频率响应,H。
imagesc - 使用缩放颜色显示图像
imagesc(C)
将数组C
中的数据显示为一个图像,该图像使用颜色图中的全部颜色。C
的每个元素指定图像的一个像素的颜色。生成的图像是一个m
×n
像素网格,其中m
和n
分别是C
中的行数和列数。这些元素的行索引和列索引确定了对应像素的中心。示例
imagesc(x,y,C)
指定图像位置。使用x
和y
可指定与C(1,1)
和C(m,n)
对应的边角的位置。要同时指定两个边角,请将x
和y
设置为二元素向量。要指定第一个边角并让imagesc
确定另一个,请将x
和y
设为标量值。图像将根据需要进行拉伸和定向。
clear allclc %用phantom函数产生Sheep-Logan的大脑图P=phantom('Modified Shepp-Logan',200);imshow(P)title('原始图像')%以下为三种不同角度的投影模式theta1=0:10:190;[R1,xp]=radon(P,theta1); %存在20个角度投影theta2=0:5:195;[R2,xp]=radon(P,theta2);%存在40个角度投影theta3=0:2:178;[R3,xp]=radon(P,theta3);%存在90个角度投影figure(1)subplot(2,3,[1,2,3]);imagesc(theta3,xp,R3);colormap(hot);colorbar;%显示图像Sheep-Logan的radon变换title('经radon变换后的图像')xlabel('\theta');ylabel('x\prime'); %定义坐标轴%用三种情况的逆radon变换来重建图像I1=iradon(R1,8);I2=iradon(R2,8);I3=iradon(R3,8);subplot(2,3,4);imshow(I1)title('投影角度20个')subplot(2,3,5);imshow(I2)title('投影角度40个')subplot(2,3,6);imshow(I3)title('投影角度90个')
图像变换
为了用正交函数或正交矩阵表示图像而对原图像进行二维线性可逆变换时,一般称原始图像为空间域图像,称变换后的图像为转换域图像,转换域图像可反变换为空间域图像。图像处理过程中用的变换都是酉变换,即变换和满足正交条件的变换,更有利于特征抽取,增强,压缩和图像编码。
clear all clc%%%%%%%%%%分辨率为100%%%%%%%%%figure(1) %创建窗口的图形对象,句柄为1subplot(2,2,1)N=100;%分辨率f=zeros(50,50); %产生一个50*50的全0数组f(15:35,23:28)=1; %定义图像数组,从15行到35行,23列到28列附值为1,为白色,其他区域为黑色imshow(f)%显示图像title('原始图像(分辨率100)');F=fft2(f,N,N); %在二维傅立叶变换前把f截断或者添加0,使其成为N*N的数组subplot(2,2,2)imshow(F,[-1,5]);title('二维快速傅立叶变换后的图像');subplot(2,2,[3,4])F2=fftshift(abs(F)); %把傅立叶变换的零频率部分移到频谱的中间x=1:N;y=1:N;%定义x和y的范围mesh(x,y,F2(x,y));%绘制立体网状图,将图形对象的色度改为灰度图像title('傅里叶变换后零频率部分移到频谱中间');colormap(gray);colorbar
图像压缩
①DCT压缩
DCT不能直接对图像产生压缩作用,但是对图像的能量有很好的集中效果,为压缩打下了基础。
clear allclcI=imread('cameraman.tif');figure(1)subplot(1,2,1)imshow(I);title('原始图像')disp('原始图像大小:')whos('I')I=im2double(I);%图像类型存储转换,将图像矩阵转换成双精度类型T=dctmtx(8);%离散余弦变换矩阵B=blkproc(I,[8 8],'P1*x*P2',T,T');mask=[1 1 1 1 0 0 0 01 1 1 0 0 0 0 01 1 0 0 0 0 0 01 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0];B2=blkproc(B,[8 8],'P1.*x',mask);I2=blkproc(B2,[8 8],'P1*x*P2',T',T);subplot(1,2,2)imshow(I2);title('压缩后的图像')disp('压缩图像的大小:')whos('I2')
②小波变换
图像分割
把一个阵列划分成若干不交叠区域。遗传算法/贝叶斯算法。
图像边缘检测
Sobel算子主要用于获得数字图像的一节梯度,常见应用是边缘检测。
edge – 查找图像强度的边缘
BW= edge(I)
返回二值图像BW
,其中的值1
对应于灰度或二值图像I
中函数找到边缘的位置,值0
对应于其他位置。默认情况下,edge
使用 Sobel 边缘检测方法。
BW= edge(I,method)
使用method
指定的边缘检测算法检测图像I
中的边缘。
BW= edge(I,method,threshold)
返回强度高于threshold
的所有边缘。
BW= edge(I,method,threshold,direction)
指定要检测的边缘的方向。Sobel 和 Prewitt 方法可以检测垂直方向和/或水平方向的边缘。Roberts 方法可以检测与水平方向成 45 度角和/或 135 度角的边缘。仅当method
是'Sobel'
、'Prewitt'
或'Roberts'
时,此语法才有效。
clear all clc I=imread('cameraman.tif');figure(1)subplot(2,3,1)imshow(I)title('原始图像')BW=edge(I,'sobel');%以自动域值选择法对图像进行Sobel算子边缘检测subplot(2,3,2)imshow(BW);title('边缘检测')[BW,thresh]=edge(I,'sobel');%返回当前Sobel算子边缘检测的域值disp('sobel算子自动选择的域值为:')disp(thresh)BW1=edge(I,'sobel',0.02,'horizontal');%以域值为0.02水平方向对图像进行Sobel算子边缘检测subplot(2,3,3)imshow(BW1)title('水平方向域值0.02')BW2=edge(I,'sobel',0.02,'vertical');%以域值为0.02垂直方向对图像进行Sobel算子边缘检测subplot(2,3,4)imshow(BW2)title('垂直方向域值0.02')BW3=edge(I,'sobel',0.05,'horizontal');%以域值为0.05水平方向对图像进行Sobel算子边缘检测subplot(2,3,5)imshow(BW3)title('水平方向域值0.05')BW4=edge(I,'sobel',0.05,'vertical');%以域值为0.05垂直方向对图像进行Sobel算子边缘检测subplot(2,3,6)imshow(BW4)title('垂直方向域值0.05') % sobel算子自动选择的阈值为:0.1433
图像识别
模板匹配模型
人脸识别算法
clear allclc %获取RGB图片i=imread('face.jpg');I=rgb2gray(i);BW=im2bw(I);figure(1)imshow(BW)%最小化背景[n1 n2]=size(BW);r=floor(n1/10);c=floor(n2/10);x1=1;x2=r;s=r*c;for i=1:10y1=1;y2=c;for j=1:10if (y2=9*c) | (x1==1 | x2==r*10)loc=find(BW(x1:x2, y1:y2)==0);[o p]=size(loc);pr=o*100/s;if prmx & (BB2(1,k)/BB2(1,k+1))<1.8mx=p;j=k;endendsubplot(1,2,2);title('人脸识别')imshow(I);hold on;rectangle('Position',[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j+1)],'EdgeColor','r' )