实验一:图像增强
【资料图】
实验名称:图像增强
实验目的:1.熟悉图像在Matlab下的读入,输出及显示;
2.熟悉直方图均衡化;
3.熟悉图像的线性指数等;
4.熟悉图像的算术运算及几何变换.
实验原理:
图像增强是为了使受到噪声等污染图像在视觉感知或某种准则下尽量的恢复到原始图像的水平之外,还需要有目的性地加强图像中的某些信息而抑制另一些信息,以便更好地利用图像。图像增强分频域处理和空间域处理,这里主要用空间域的方法进行增强。空间域的增强主要有:灰度变换和图像的空间滤波。
图像的直方图实际上就是图像的各像素点强度概率密度分布图,是一幅图像所有像素集合的最基本统计规律,均衡化是指在每个灰度级上都有相同的像素点过程。
实验内容如下:
I=imread("E:\cs.jpg");%读取图像subplot(2,2,1),imshow(I),title("源图像")J=rgb2gray(I)%灰度处理subplot(2,2,2),imshow(J) %输出图像title("灰度图像") %在原始图像中加标题subplot(2,2,3),imhist(J) %输出原图直方图title("原始图像直方图")
几何运算:I=imread("E:\cs.jpg");%读取图像subplot(1,2,1),imshow(I);theta = 30;K = imrotate(I,theta); subplot(1,2,2),imshow(K)
对数运算:I=imread("E:\dog.jpg");subplot(2,2,1),imshow(I),title("源图像")J=rgb2gray(I)%灰度处理subplot(2,2,2),imshow(J),title("灰度变换后图像")J1=log(1+double(J));subplot(2,2,3),imshow(J1,[]),title("对数变换后")
指数运算:I=imread("E:\dog.jpg");f=double(I);g=(2^2*(f-1))-1f=uint8(f);g=uint8(g);subplot(1,2,1);subimage(f),title("变换一")subplot(1,2,2);subimage(g),title("变换二")
加法运算:clc;clear all;close all;i = imread("E:\dog.jpg");j = imnoise(i,"gaussian",0,0.02);subplot(1,3,1),imshow(i),title("图一")subplot(1,3,2),imshow(j),title("图二")k=zeros(242,308); for p=1:100 j = imnoise(i,"gaussian",0,0.02); j1 = im2double(j); k = k + j1; endk=k/100;subplot(1,3,3),imshow(k),title("图三")
实验二
实验名称:图像变换
实验目的:
(1)进一步对matlab的了解和使用;
(2)学习如何在matlab中对数字图像的处理;
实验原理:
图像和其他信号一样,既能在空间域处理,也能在频率域处理。把图像信息从空域变换到频域,可以更好的分析加工处理。因为图像信息的频域处理具有如下特点:
(1)能量守恒,但能量重新分配;
(2)有利于提取图像的某些特征;
(3)正交变换具有能量集中作用,可以实现图像的高效压缩编码; (4)频域用快速算法;
实验器材:电脑 matlab软件
实验内容:
(1)了解正交变换基本概念
(2)掌握图像的离散傅里叶和离散余弦变换
(3)熟悉图像的沃尔什及哈达玛变换
实验过程如下:
傅里叶变换I = imread("E:\dog.jpg")I = rgb2gray(I)J = fft2(I)subplot(2,2,1),imshow(I),title("灰度变换")J = fftshift(J)subplot(2,2,2),imshow(log(abs(J)),[]),title("傅里叶变换")J(abs(J)<5000)=0subplot(2,2,3),imshow(log(abs(J)+eps),[]),title("滤波")J = ifftshift(J)K = ifft2(J)subplot(2,2,4),imshow(K,[0 255]),title("傅里叶逆变换")
余弦变换:clear all;RGB=imread("E:\dog.jpg");I=rgb2gray(RGB);figure;imshow(I);title("灰度图像");J=dct2(I);figure;imshow(log(abs(J)),[]);colormap(jet(64)),colorbar;title("二维离散余弦变换")
沃尔什—哈达玛变换:I=zeros(2.^8);I(2.^7-2.^4+1:2.^7+2.^4,2.^7-2.^4+1:2.^7+2.^4)=ones(2*2.^4);subplot(1,2,1);colormap(gray(128)),imagesc(I);[m,n]=size(I)for k=1:nwht(:,k)=hadamard(m)*I(:,k)/m;endfor j=1:mwh(:,j)=hadamard(n)*wht(j,:)"/n;endwh=wh";subplot(1,2,2);colormap(gray(128)),imagesc(wh);
Radon变换:R=radon(I,theta):I表示待处理的图像,theta表示Radon变换的方向角度,可以是一个标量或向量值。R的每一列对应图像I在theta某祎角度的Radon变换值。I=zeros(120,120); I(25:75,25:75)=1;figure;imshow(I);theta=0:180;[R,xp]=radon(I,theta);figure;imshow(R,[],"Xdata",theta,"Ydata",xp,..."InitialMagnification","fit")xlabel("\theta (degrees)")ylabel("x""")colormap(hot),colorbariptsetpref("ImshowAxesVisible","off")
实验三
实验名称:图像的复原
实验目的:1.加深图像复原的相关原理,熟悉相关算法;
2.能够产生运动模糊图像,加入高斯,椒盐噪声,并对噪 声进行中值,均值,最大值,最小值进行滤波复原;
3.对彩色图像RGB转换到HISI,并显示对应分量,同时完成相关平滑 滤波。
实验仪器:计算机,Matlab软件
实验原理:
图像复原的基本思路:先建立退化的数学模型,然后根据该模型对退化图像进行拟图像复原合。图像复原模型可以用连续数学和离散数学处理,处理项的实现可在空间域卷积,或在频域相乘.图像复原的基本任务:消除模糊。
图像的退化主要是由系统的相关特性以及噪声两方面的因素所导致的,我们可以通过设计一个合适的复原滤波器(即实现逆滤波过程)来实现图像的复原。图1 中f(x,y)表示的是一幅静止、二维的图像,它在外部噪声n(x,y)的干扰作用之下,在经过系统h(x,y)之后,退化成为g(x,y),复原后的图像为f(x,y)。针对于退化图像的复原,我们通常可以采用这样两种方式来进行:
其一,当对于原始图像缺乏必需的先验知识时,我们可以采用就退化过程建立一个模型,首先对其进行一个大概的描述,然后在复原的过程根据具体的情况进行逐步合理的修正,逐步消除误差影响。这种方法建立在对图像的退化过程进行合理的估计的基础之上,从这个角度来看它是一种估计的方法;
其二,当我们对原始图像具有足够的先验知识时,我们这时候则直接针对原始图像建立一个精确的数学模型,然后再对退化图像进行复原处理,这种效果更好.
加入噪声:I=imread("E:\dog.jpg");%读取原图像 %考虑是否加入灰度处理 J1=imnoise(I,"salt & pepper",0.02); %加入椒盐噪声J2=imnoise(I,"gaussian",0,0.01);%加入高斯白噪声 J3=imnoise(I,"poisson");%加入泊松噪声 J4=imnoise(I,"speckle",0.04);%加入乘法噪声 figure;subplot(221),imshow(J1);title("加入椒盐噪声后图像")subplot(222),imshow(J2);title("加入高斯白噪声后图像")subplot(223),imshow(J3);title("加入泊松噪声后图像")subplot(224),imshow(J4);title("加入乘法噪声后图像")
%对椒盐噪声和高斯白噪声进行imfilter滤波rgb=imread("E:\dog.jpg");h=ones(5,5)/25;rgb1=imfilter(rgb,h);rgb2=imfilter(rgb1,h,"replicate");figure;subplot(1,3,1);imshow(rgb);title("Original");%原始subplot(1,3,2);imshow(rgb1);title("Filtered");%一维滤波subplot(1,3,3);imshow(rgb);title("boundary replication");%边缘滤波
%增加运动滤波,水平边缘增强,拉普拉斯滤波rgb=imread("E:\dog.jpg");h1=[0,0,0.0000,0.0021,0.0042;0.1958,0.1979,0.2000,0.1979,0.1958 ;0.0042,0.0021,0.0000,0,0];h2=[ 1,2,1;0,0,0;-1,-2,-1];h3=[0.1667,0.6667,0.1667;0.6667,-3.3333,0.1667;0.1667,0.6667, 0.1667];rgb1=imfilter(rgb,h1);rgb2=imfilter(rgb,h2);rgb3=imfilter(rgb,h3);figure;subplot(2,2,1),imshow(rgb),title("原图像")subplot(2,2,2),imshow(rgb1),title("运动滤波")subplot(2,2,3),imshow(rgb2),title("水平边缘增强")subplot(2,2,4),imshow(rgb3),title("拉普拉斯滤波")
%fspecial产生线性滤波器rgb=imread("E:\dog.jpg");h1=fspecial("average",[5,3]);h2=fspecial("gaussian",[5,3],1);h3=fspecial("laplacian",0);rgb1=imfilter(rgb,h1);rgb2=imfilter(rgb,h2);rgb3=imfilter(rgb,h3);figure;subplot(2,2,1),imshow(rgb),title("原图像")subplot(2,2,2),imshow(rgb1),title("均值滤波")subplot(2,2,3),imshow(rgb2),title("高斯滤波")subplot(2,2,4),imshow(rgb3)
I=imread("E:\dog.jpg");%二值化函数的输入图像既可以是彩色图像也可以是灰度图像 th=graythresh(I); %自动确定二值化的最佳阈值 J=im2bw(I,th); %二值化阈值可以自己设定,值为0-1之间,而不是0-255,这一点要切记 subplot(121),imshow(I); subplot(122),imshow(J);
产生运动模糊图像clc;clear all;I = imread("E:\dog.jpg");subplot(121);imshow(I);title("原始图像");H = fspecial("motion",20,45);MotionBlur = imfilter(I,H,"replicate");subplot(122);imshow(MotionBlur);title("运动模糊图像");
clc;clear all;I = imread("eight.tif");J = imnoise(I,"salt & pepper",0.02);K = medfilt2(J);subplot(121);imshow(J);title("加入椒盐噪声的图像");subplot(122);imshow(K);title("中值滤波的图像");
clc;clear all;I = imread("snowflakes.png");MAX = ordfilt2(I,25,ones(5,5));MIN = ordfilt2(I,1,ones(5,5));subplot(221);imshow(I);title("原始图像");subplot(222);imshow(MAX);title("最大值滤波");subplot(223);imshow(MIN);title("最小值滤波");
实验四
实验名称:图像的检测与分割
实验目的:
(1)进一步对matlab的了解和使用;
(2)学习如何在matlab中对数字图像的处理;
实验原理:
数字图像处理主要目的:一是对图像进行加工和处理,得到满足人的视觉和心理需要的改变进行式。二是对图像中的目标物进行分析很理解,包括:
(1)把图像分割成不同目标物和背景的不同区域;
(2)提取正确代表不同目标物特点的特征参数,并进行扫描;
(3)对图像中目标物进行识别和分类;
实验器材:电脑 matlab软件
实验内容:
(1)了解图像分割的概念
(2)掌握阈值分割及边缘点检测的基本方法
(3)对检测目标图像提取特征并进行分析
实验过程:
图像分割:指的是将数字图像细分为多个图像子区域(像素的集合)(也被称作超像素)的过程,就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。图像分割的目的是简化或改变图像的表示形式,使得图像更容易理解和分析。图像分割通常用于定位图像中的物体和边界(线,曲线等)。更精确的,图像分割是对图像中的每个像素加标签的一个过程,这一过程使得具有相同标签的像素具有某种共同视觉特性。图像分割的结果是图像上子区域的集合(这些子区域的全体覆盖了整个图像),或是从图像中提取的轮廓线的集合(例如边缘检测)。一个子区域中的每个像素在某种特性的度量下或是由计算得出的特性都是相似的,例如颜色、亮度、纹理。邻接区域在某种特性的度量下有很大的不同。现有的图像分割方法主要分以下几类:基于阈值的分割、区域生长、区域分裂合并、分水岭算法、边缘分割(边缘检测)、直方图法、聚类分析、小波变换等。
(1)阈值分割及边缘点检测的基本方法
阈值分割:双峰法、迭代法、OTSU方法
双峰法:根据双峰法原理,观察到灰度图像直方图呈现明显的双峰状,则选取双峰之间的谷底所对应的灰度级作为阈值分割。如上图,选取160作为分割点。
I=imread("E:\dog.jpg");I=rgb2gray(I);imhist(I);I=imread("E:\dog.jpg");I=rgb2gray(I);figuresubplot(1,2,1)imshow(I);[width,height]=size(I);title("原图")for i=1:widthfor j=1:heightif(I(i,j)<230)RC(i,j)=0;elseRC(i,j)=1;endendendsubplot(1,2,2)imshow(RC)title("双峰法图像阈值分割处理效果图")
迭代法I=imread("E:\dog.jpg");I=rgb2gray(I);Figure,subplot(1,2,1)imshow(I);title("原图")clc;clear all;close all;I=imread("E:\dog.jpg");I=rgb2gray(I);Figure,subplot(1,2,1)imshow(I);title("原图");I=double(I);T=(min(I(:))+max(I(:)))/2;done=false;i=0;while ~doner1=find(I<=T);r2=find(I>T);Tnew=(mean(I(r1))+mean(I(r2)))/2;done=abs(Tnew-T)<1;T=Tnew;i=i+1;endI(r1)=0;I(r2)=1;subplot(1,2,2);imshow(I);title("迭代效果图");
OTSU方法I=imread("E:\dog.jpg");I=rgb2gray(I);figuresubplot(1,2,1)imshow(I);title("原图");[width,height]=size(I);level=graythresh(I);BW=im2bw(I,level);subplot(1,2,2)imshow(BW);title("OSTU阈值分割效果图");
边缘点检测:Prewitt算子检测图像的边缘、不同σ值的LoG算子检测图像的边缘、Canny算子检测图像的边缘I = imread("bacteria.BMP");BW1 = edge(I,"prewitt",0.04); figure(1);imshow(I);figure(2);imshow(BW1);Prewitt算子检测图像的边缘
I = imread("E:\bacteria.BMP");BW1 = edge(I,"log",0.003); % σ=2imshow(BW1);title("σ=2")BW1 = edge(I,"log",0.003,3); % σ=3figure, imshow(BW1);title("σ=3")不同σ值的LoG算子检测图像的边缘
I = imread("E:\bacteria.BMP");imshow(I);BW1 = edge(I,"canny",0.2);figure,imshow(BW1);Canny算子检测图像的边缘
(2)对检测目标图像提取特征并进行分析(基于区域的图像特征提取)a=imread("E:\dog.jpg");%读入图像subplot(2,2,1);%设置原始图像显示位置imshow(a);%显示原始图像title("原始图像");%命名为原始图像f=rgb2gray(a);%将原始图像转换成灰度图像B=medfilt2(f);%将图像进行中值滤波subplot(2,2,2);%设置灰度图像显示位置imshow(B);title("灰度图像");seedx=[256,128,300];seedy=[128,256,284];hold onplot(seedx,seedy,"gs","linewidth",1);title("灰度图像处理");B=double(B);markerim=B==B(seedy(1),seedx(1));for i=2:length(seedx)markerim=markerim|(B==B(seedy(i),seedx(i)));endthresh=[15,10,15];maskim=zeros(size(B));for i=1:length(seedx)g=abs(B-B(seedy(i),seedx(i)))<=thresh(i);maskim=maskim|g;end[g,nr]=bwlabel(imreconstruct(markerim,maskim),8);g=mat2gray(g);subplot(2,2,3);imshow(g);title("最终结果");seedx=[156,78,300];seedy=[78,156,284];hold onplot(seedx,seedy,"gs","linewidth",1);title("灰度图像处理");B=double(B);markerim=B==B(seedy(1),seedx(1));for i=2:length(seedx)markerim=markerim|(B==B(seedy(i),seedx(i)));endthresh=[15,10,15];maskim=zeros(size(B));for i=1:length(seedx)g=abs(B-B(seedy(i),seedx(i)))<=thresh(i);maskim=maskim|g;end[g,nr]=bwlabel(imreconstruct(markerim,maskim),8);g=mat2gray(g);subplot(2,2,3);imshow(g);title("最终结果");seedx=[256,128,300];seedy=[128,256,284];hold onplot(seedx,seedy,"gs","linewidth",1);title("灰度图像处理");B=double(B);markerim=B==B(seedy(1),seedx(1));for i=2:length(seedx)markerim=markerim|(B==B(seedy(i),seedx(i)));endthresh=[15,10,15];maskim=zeros(size(B));for i=1:length(seedx)g=abs(B-B(seedy(i),seedx(i)))<=thresh(i);maskim=maskim|g;end[g,nr]=bwlabel(imreconstruct(markerim,maskim),8);g=mat2gray(g);subplot(2,2,3);imshow(g);title("最终结果");seedx=[108,108,300];seedy=[108,108,284];hold onplot(seedx,seedy,"gs","linewidth",1);title("灰度图像处理");B=double(B);markerim=B==B(seedy(1),seedx(1));for i=2:length(seedx)markerim=markerim|(B==B(seedy(i),seedx(i)));endthresh=[15,10,15];maskim=zeros(size(B));for i=1:length(seedx)g=abs(B-B(seedy(i),seedx(i)))<=thresh(i);maskim=maskim|g;end[g,nr]=bwlabel(imreconstruct(markerim,maskim),8);g=mat2gray(g);subplot(2,2,3);imshow(g);title("最终结果");seedx=[108,108,108];seedy=[108,108,108];hold onplot(seedx,seedy,"gs","linewidth",1);title("灰度图像处理");B=double(B);markerim=B==B(seedy(1),seedx(1));for i=2:length(seedx)markerim=markerim|(B==B(seedy(i),seedx(i)));endthresh=[15,10,15];maskim=zeros(size(B));for i=1:length(seedx)g=abs(B-B(seedy(i),seedx(i)))<=thresh(i);maskim=maskim|g;end[g,nr]=bwlabel(imreconstruct(markerim,maskim),8);g=mat2gray(g);subplot(2,2,3);imshow(g);title("最终结果");seedx=[80,50,108];seedy=[50,80,108];hold onplot(seedx,seedy,"gs","linewidth",1);title("灰度图像处理");B=double(B);markerim=B==B(seedy(1),seedx(1));for i=2:length(seedx)markerim=markerim|(B==B(seedy(i),seedx(i)));endthresh=[15,10,15];maskim=zeros(size(B));for i=1:length(seedx)g=abs(B-B(seedy(i),seedx(i)))<=thresh(i);maskim=maskim|g;end[g,nr]=bwlabel(imreconstruct(markerim,maskim),8);g=mat2gray(g);subplot(2,2,3);imshow(g);title("最终结果");th=graythresh(g);J=im2bw(g,th);imshow(J);A1=bwperim(J);L=0;[m,n]=size(A1);for i=1:m*nif (A1(i)==1) L=L+1;endendL [m,n]=size(J);S=0;for i=1:m*nif (A1(i)==1) S=S+1;endendS x=0; y=0;for i=1:m for j=1:nif(g(i,j)==1)x=i+x;y=j+y;endendendX=x/Sth=graythresh(g);J=im2bw(g,th);imshow(J);A1=bwperim(J);L=0;[m,n]=size(A1);for i=1:m*nif (A1(i)==1) L=L+1;endendL [m,n]=size(J);S=0;for i=1:m*nif (A1(i)==1) S=S+1;endendS x=0; y=0;for i=1:m for j=1:nif(g(i,j)==1)x=i+x;y=j+y;endendendX=x/Sth=graythresh(g);J=im2bw(g,th);imshow(J);A1=bwperim(J);L=0;[m,n]=size(A1);for i=1:m*nif (A1(i)==1) L=L+1;endendL[m,n]=size(J);S=0;for i=1:m*nif (A1(i)==1) S=S+1;endendS x=0; y=0;for i=1:m for j=1:nif(g(i,j)==1)x=i+x;y=j+y;endendendX=x/Sth=graythresh(g);J=im2bw(g,th);imshow(J);A1=bwperim(J);L=0;[m,n]=size(A1);for i=1:m*nif (A1(i)==1) L=L+1;endendL[m,n]=size(J);S=0;for i=1:m*nif (A1(i)==1) S=S+1;endendSx=0;y=0;for i=1:m for j=1:nif(g(i,j)==1)x=i+x;y=j+y;endendendX=x/S
灰度处理是指不含彩色信息,只含亮度信息的图像,乍眼一看,灰度图就是黑白的,但是,点与点之间黑的程度是不一样的。原图像为400*348像素,经程序灰度化处理和中值滤波后,整幅图像很易于后续的研究处理。
本次设计使我对数字图像处理技术的原理及MATLAB编程技术有了更进一步的了解。同时,深入懂得了图像中区域特征的检测与提取技术研究的具体流程和实施方法。让我不仅仅是在学习知识上,还有对科学实验的严谨态度上都有了很大提升。
实验五
实验名称:形态学图像处理
实验仪器: 电脑 MATLAB软件
实验目的:
(1)了解数学形态学的基本概念;
(2)熟悉常用的结构元素;
(3)掌握腐蚀,膨胀以及开闭运算;
实验原理:数学形态学是以形态结构元素为基础对图像进行分析的数学工具。它的基本思想是用具有一定形态的结构元素区度量和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并除去不相干的结构。数学形态学的基本运算有4个:膨胀、腐蚀、开启和闭合。它们在二值图像中和灰度图像中各有特点。基于这些基本运算还可以推到和组合成各种数学形态学实用算法。用他们可以进行图像形状和结构的分析及处理,包括基于流域概念的图像分割,基于腐蚀和开运算的骨架抽取以及图像编码压缩,基于测地距离的图像重建,基于形态学滤波器的颗粒分析和基于击中/击不中变换的目标识别等。
实验内容及步骤:
膨胀和腐蚀这两种运算时紧密联系在一起的,最常见的膨胀和腐蚀操作的组合为开操作、闭操作、击中击不中变换。Matlab 提供了 imdilate 函数来实现膨胀操作。开操作是指先对图像进行腐蚀,然后膨胀其结果。闭操作是指先对图像进行膨胀,后对其进行腐蚀。
I=imread("E:\zy.jpg");se=strel("disk",5,4);J1=imerode(I,se);J2=imopen(I,se);J3=imclose(I,se);subplot(2,2,1),imshow(I),xlabel("a) 原图");subplot(2,2,2),imshow(J1),xlabel("b) 腐蚀");subplot(2,2,3),imshow(J2),xlabel("c) 开运算");subplot(2,2,4),imshow(J3),xlabel("d) 闭运算");