数字图像处理-图像分割源代码
图像处理源代码
去噪function y= quzaoI= imread('4.jpg'); %读取图像f=rgb2gray(I);%转化成灰度图subplot(3,2,1);% 分割2*3个窗口。
取第一个窗口,下面在第一个窗口处显示图像imshow (f);%显示灰度图title('原图')%给显示的图像命名为“原始图”subplot(3,2,3), imshow(f),title('原图');subplot(3,2,5), imshow(f);title('原图');[m n]=size(f); %获取灰度图的大小f=im2double(f);%转换f为双精度型c=1/9*[1 1 1;1 1 1;1 1 1]; %3*3模板for i=1:mfor j=1:nL=f(i:i,j:j).*c; %求点积G(i,j)=sum(sum(L));%求和endendG=imadjust(G,[0/255 255/255],[0 1]);subplot(3,2,2); imshow(G);%取第三个窗口title('3*3模板邻域平均')%命名为“3*3模板”K1=medfilt2(f,[3,3]);%3*3的窗口对f进行中值滤波subplot(3,2,4), imshow(K1),title('中值滤波后结果');X = im2double(f); % 转换成双精度类型%提取通道信息xr = X(:, :, 1);%自适应阈值-------------------------------------------------------------x4_r = den4(X, 'sym4', 2);% 恢复去噪后的图像x4 = cat(3, x4_r); % 自适应阈值x4=im2double(x4);%显示去噪后的图像subplot(3,2,6), imshow(x4);title('自适应阈值去噪');psnr1 = PSNR_color(K1, f)psnr2 = PSNR_color(x4, X)imwrite(x4,'qz2.jpg','jpg');imwrite(K1,'qz1.jpg','jpg');增强clear;clc;f = imread('qz2.jpg');g=im2double(f);%******************************************************************* %显示灰度图的直方图,进行直方图均衡化以后的图像g1 = histeq(g);figure,subplot(1,2,1),imhist(g),title('原图的直方图');subplot(1,2,2),imhist(g1),title('直方图均衡化后的直方图');pause;%******************************************************************* %利用高斯多峰值算法来对图像进行相应的直方图处理p= manualhist%交互输入双峰值参数理想值为(0.15,0.05,0.75,0.05,1,0.07,0.002)g2= histeq(g,p);figure,imhist(g2);subplot(2,2,1),imshow(g),title('原图');subplot(2,2,2),imshow(g1),title('普通直方图处理后的图');subplot(2,2,3),imshow(g2),title('高斯多峰值算法处理后的图');imwrite(g1,'zq1.jpg','jpg');imwrite(g2,'zq2.jpg','jpg');q=qingxi(g1);q=qingxi(g2);pause;%****************************************************************** %利用空间掩膜来对所处理的图像进行增强w = [0 1 0;1 -4 1;0 1 0];%产生([0 1 0;1 -4 1;0 1 0])的拉普拉斯算子;h = fspecial(type,para)% 其中type指定算子的类型,para 指定相应的参数;参数alpha用于控制算子形状,取值范围为[0,1],默认值为0.2w1 = [1 1 1;1 -8 1;1 1 1];%离散拉普拉斯算子的扩展模板g3 = im2double(g);g4 = im2double(g1);g5 = im2double(g2);g6 = g3 + imfilter(g3,w,'replicate');g7 = g3 + imfilter(g3,w1,'replicate');g8 = g4 + imfilter(g4,w,'replicate');g9 = g4 + imfilter(g4,w1,'replicate');g10 = g5 + imfilter(g5,w,'replicate');g11 = g5 + imfilter(g5,w1,'replicate');figure,subplot(2,3,1),imshow(g6);title('原图普通掩膜');subplot(2,3,4),imshow(g7);title('原图扩展掩膜');subplot(2,3,2),imshow(g8);title('直方图后普通掩膜');q=qingxi(g8);imwrite(g8,'zq3.jpg','jpg');subplot(2,3,5),imshow (g9);title('直方图后扩展掩膜');subplot(2,3,3),imshow(g10);title('高斯双峰后普通掩膜');imwrite(g10,'zq4.jpg','jpg');q=qingxi(g10);subplot(2,3,6),imshow(g11);title('高斯双峰后扩展掩膜');pause;%******************************************************************* %利用小波进行图片增强处理[c,s]=wavedec2(f,2,'sym4');%实现图像(即二维信号)的2层分解sizec=size(c);for i=1:sizec(2)if(c(i)>1000)c(i)=6*c(i);elsec(i)=0.005*c(i);endendxx=waverec2(c,s,'sym4');q=qingxi(xx);figure;subplot(1,2,1);imshow(f);title('原图');subplot(1,2,2);imshow(xx);title('小波增强图像'); imwrite(xx,'zq5.jpg','jpg');神经网络clcclose all;P=[0.6192;0.5628;0.6208;0.5000;0.6155;0.6182;0.4210;0.0433;0.1094;0.1910;0.3023;0.2539;0.3215;0.3927;0.3604;0.3649;0.3283;0.4050;]';%数据输入(弧度)T=[0; 0; 0; 0; 0; 0; 0; 2; 2; 2; 2; 2; 2; 1; 1; 1; 1; 1;]';%数据的输出net=newff([0 1],[30,1],{'tansig','purelin'});%隐含层有30个神经元,输出层有一个神经元。
数字图像处理代码大全
1.图像反转MATLAB程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1); %图像反转线性变换H=uint8(J);subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(H);2.灰度线性变换MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1]subplot(2,2,3),imshow(J);title('线性变换图像[0.1 0.5]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1]subplot(2,2,4),imshow(K);title('线性变换图像[0.3 0.7]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系3.非线性变换MATLAB程序实现如下:I=imread('xian.bmp');I1=rgb2gray(I);subplot(1,2,1),imshow(I1);title('灰度图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系J=double(I1);J=40*(log(J+1));H=uint8(J);subplot(1,2,2),imshow(H);title('对数变换图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系4.直方图均衡化MATLAB程序实现如下:I=imread('xian.bmp');I=rgb2gray(I);figure;subplot(2,2,1);imshow(I);subplot(2,2,2);imhist(I);I1=histeq(I);figure;subplot(2,2,1);imshow(I1);subplot(2,2,2);imhist(I1);5.线性平滑滤波器用MATLAB实现领域平均法抑制噪声程序:I=imread('xian.bmp');subplot(231)imshow(I)title('原始图像')I=rgb2gray(I);I1=imnoise(I,'salt & pepper',0.02);subplot(232)imshow(I1)title('添加椒盐噪声的图像')k1=filter2(fspecial('average',3),I1)/255; %进行3*3模板平滑滤波k2=filter2(fspecial('average',5),I1)/255; %进行5*5模板平滑滤波k3=filter2(fspecial('average',7),I1)/255; %进行7*7模板平滑滤波k4=filter2(fspecial('average',9),I1)/255; %进行9*9模板平滑滤波subplot(233),imshow(k1);title('3*3模板平滑滤波'); subplot(234),imshow(k2);title('5*5模板平滑滤波'); subplot(235),imshow(k3);title('7*7模板平滑滤波');subplot(236),imshow(k4);title('9*9模板平滑滤波');6.中值滤波器用MATLAB实现中值滤波程序如下:I=imread('xian.bmp');I=rgb2gray(I);J=imnoise(I,'salt&pepper',0.02);subplot(231),imshow(I);title('原图像');subplot(232),imshow(J);title('添加椒盐噪声图像'); k1=medfilt2(J); %进行3*3模板中值滤波k2=medfilt2(J,[5,5]); %进行5*5模板中值滤波k3=medfilt2(J,[7,7]); %进行7*7模板中值滤波k4=medfilt2(J,[9,9]); %进行9*9模板中值滤波subplot(233),imshow(k1);title('3*3模板中值滤波'); subplot(234),imshow(k2);title('5*5模板中值滤波'); subplot(235),imshow(k3);title('7*7模板中值滤波'); subplot(236),imshow(k4);title('9*9模板中值滤波');7.用Sobel算子和拉普拉斯对图像锐化:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,2,2),imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系H=fspecial('sobel'); %选择sobel算子J=filter2(H,I1); %卷积运算subplot(2,2,3),imshow(J);title('sobel算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子J1=conv2(I1,h,'same'); %卷积运算subplot(2,2,4),imshow(J1);title('拉普拉斯算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系8.梯度算子检测边缘用MATLAB实现如下:I=imread('xian.bmp');subplot(2,3,1);imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,3,2);imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=edge(I1,'roberts');figure;subplot(2,3,3);imshow(I2);title('roberts算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=edge(I1,'sobel');subplot(2,3,4);imshow(I3);title('sobel算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I4=edge(I1,'Prewitt');subplot(2,3,5);imshow(I4);title('Prewitt算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系9.LOG算子检测边缘用MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像');I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'log');subplot(2,2,3);imshow(I2);title('log算子分割结果');10.Canny算子检测边缘用MATLAB程序实现如下:I=imread('xian.bmp'); subplot(2,2,1);imshow(I);title('原始图像')I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'canny');subplot(2,2,3);imshow(I2);title('canny算子分割结果');11.边界跟踪(bwtraceboundary函数)clcclear allI=imread('xian.bmp');figureimshow(I);title('原始图像');I1=rgb2gray(I); %将彩色图像转化灰度图像threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限BW=im2bw(I1, threshold); %将灰度图像转化为二值图像figureimshow(BW);title('二值图像');dim=size(BW);col=round(dim(2)/2)-90; %计算起始点列坐标row=find(BW(:,col),1); %计算起始点行坐标connectivity=8;num_points=180;contour=bwtraceboundary(BW,[row,col],'N',connectivity,n um_points);%提取边界figureimshow(I1);hold on;plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2); title('边界跟踪图像');12.Hough变换I= imread('xian.bmp');rotI=rgb2gray(I);subplot(2,2,1);imshow(rotI);title('灰度图像');axis([50,250,50,200]);grid on;axis on;BW=edge(rotI,'prewitt');subplot(2,2,2);imshow(BW);title('prewitt算子边缘检测后图像');axis([50,250,50,200]);grid on;axis on;[H,T,R]=hough(BW);subplot(2,2,3);imshow(H,[],'XData',T,'YData',R,'InitialMagnification', 'fit');title('霍夫变换图');xlabel('\theta'),ylabel('\rho');axis on , axis normal, hold on;P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));x=T(P(:,2));y=R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); subplot(2,2,4);,imshow(rotI);title('霍夫变换图像检测');axis([50,250,50,200]);grid on;axis on;hold on;max_len=0;for k=1:length(lines)xy=[lines(k).point1;lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red'); len=norm(lines(k).point1-lines(k).point2);if(len>max_len)max_len=len;xy_long=xy;endendplot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','c yan');13.直方图阈值法用MATLAB实现直方图阈值法:I=imread('xian.bmp');I1=rgb2gray(I);figure;subplot(2,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系[m,n]=size(I1); %测量图像尺寸参数GP=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255GP(k+1)=length(find(I1==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置endsubplot(2,2,2),bar(0:255,GP,'g') %绘制直方图title('灰度直方图')xlabel('灰度值')ylabel('出现概率')I2=im2bw(I,150/255);subplot(2,2,3),imshow(I2);title('阈值150的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=im2bw(I,200/255); %subplot(2,2,4),imshow(I3);title('阈值200的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系14. 自动阈值法:Otsu法用MATLAB实现Otsu算法:clcclear allI=imread('xian.bmp');subplot(1,2,1),imshow(I);title('原始图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系level=graythresh(I); %确定灰度阈值BW=im2bw(I,level);subplot(1,2,2),imshow(BW);title('Otsu法阈值分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系15.膨胀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀subplot(1,2,2);imshow(I2);title('膨胀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系16.腐蚀操作MATLAB实现腐蚀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀subplot(1,2,2);imshow(I2);title('腐蚀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系17.开启和闭合操作用MATLAB实现开启和闭合操作I=imread('xian.bmp'); %载入图像subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1); %采用半径为1的圆作为结构元素I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(2,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(2,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系18.开启和闭合组合操作I=imread('xian.bmp'); %载入图像subplot(3,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(3,2,2),imshow(I1);axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(3,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(3,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I4=imopen(I1,se);I5=imclose(I4,se);subplot(3,2,5),imshow(I5); %开—闭运算图像title('开—闭运算图像');axis([50,250,50,200]);axis on; %显示坐标系I6=imclose(I1,se);I7=imopen(I6,se);subplot(3,2,6),imshow(I7); %闭—开运算图像title('闭—开运算图像');axis([50,250,50,200]);axis on; %显示坐标系19.形态学边界提取利用MATLAB实现如下:I=imread('xian.bmp'); %载入图像subplot(1,3,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(1,3,2),imshow(I1);title('二值化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=bwperim(I1); %获取区域的周长subplot(1,3,3),imshow(I2);title('边界周长的二值图像');axis([50,250,50,200]);grid on;axis on; 20.形态学骨架提取利用MATLAB实现如下:I=imread('xian.bmp'); subplot(2,2,1),imshow(I); title('原始图像');axis([50,250,50,200]); axis on; I1=im2bw(I);subplot(2,2,2),imshow(I1); title('二值图像');axis([50,250,50,200]); axis on; I2=bwmorph(I1,'skel',1); subplot(2,2,3),imshow(I2); title('1次骨架提取');axis([50,250,50,200]); axis on; I3=bwmorph(I1,'skel',2); subplot(2,2,4),imshow(I3);title('2次骨架提取'); axis([50,250,50,200]); axis on;21.直接提取四个顶点坐标I = imread('xian.bmp');I = I(:,:,1);BW=im2bw(I);figureimshow(~BW)[x,y]=getpts。
图像分割代码
前段时间,我看论文主要是看的关于图像分割的方法。
所以我想自己是否可以按论文中所说的方法编写出程序,并且成功的实现图像分割,以下是我经过查阅资料写出的程序以及在matlab软件中运行出来的结果。
一、Matlab代码及运行结果:基于阀值分割的matlab代码以及运行出来的图像(迭代阀值和Otsu 法)clear all;close all;f=imread('cameraman.tif');subplot(2,2,1);imshow(f);subimage(f);title('原始图像');f=double(f);T=(min(f(:))+max(f(:)))/2done=false;i=0;while~doner1=find(f<=T);r2=find(f>T);Tnew=(mean(f(r1))+mean(f(r2)))/2done=abs(Tnew-T)<1;T=Tnew;i=i+1;endf(r1)=0;f(r2)=1;subplot(2,2,2);subimage(f);title('迭代阀值二值化图像'); f=imread('cameraman.tif');subplot(2,2,3);subimage(f);title('原始图像');T=graythresh(f);g=im2bw(f, T);subplot(2,2,4);subimage(g);title('Otsu方法二值化图像');二、理论收获:图像的二值化就是将图像上的像素点的灰度值设置为0与255,也就是只有黑和白的视觉效果。
常用的阈值分割方法有迭代阈值法和Otsu法两种。
Otsu是一种全局化的动态二值化方法,又叫大津法。
该算法的思路是:设使用某一阈值将灰度图像根据灰度大小,分成目标部分和背景部分两类。
在这两类的类内方差最小和类间方差最大时,得到的阈值是最优化的二值化阈值。
数字图像处理——图像空余增强实验源代码及实验报告
试验一一, 实验目的上机实验是为训练学生的实际程序设计能力安排的、包含在教学课时内的教学内容。
实验目的是:1 , 进一步深入理解相关部分的基本概念和授课内容。
2, 进一步提高实际动手进行程序设计的能力。
二,实验要求(1), 熟悉Matlab软件、编程以及图像处理工具箱。
掌握Matlab的操作界面和基本操作流程掌握m文件的使用掌握Matlab关于图像的读入、输出的处理函数,比如:imread、imshow、figure、Subplot、imwrite、colormap(2), 利用图像处理工具箱进行空域图像增强实验利用Matlab的图像处理工具箱中提供的函数进行“点运算”利用Matlab的图像处理工具箱中提供的函数进行“算术运算”灰度切割、分段线性变换、位图切割:需要进行Matlab编程图像平均减少噪声:需要进行Matlab编程要求至少实现5个(包括5个)以上的,在课程中讲过的图像空域增强方法。
三,程序设计基本思想Matlab关于图像的读入,输出的处理函数以及matlab图像处理工具箱里的函数可在matlab中能直接调用,多做几个试验就能熟练掌握运用这几个函数;后面的需要用matlab编程来实现数字图像处理功能的试验需自己编写源程序,做完以上两个部分,这个试验就完成了。
四,原理概述a)学会调用matlab图像处理工具箱的函数,这个可以在matlab中直接试验。
b)第二部分,要求用matlab编程工具来实现图像的灰度切割,位图切割等功能。
(1),灰度切割的原理:灰度切割实际上是分段函数线性变换的一种处理方法,他所要实现的主要功能是变幻某一段灰度值的灰度值(将之变亮或变暗或根据要求做其他方面的变幻),编写源程序时只需提出带改变部分的灰度值,对其进行符合要求的变化即可。
(2),位图切割的原理:位图切割同样是分段线性变换的一种,不同的是文图切割中把一幅图像“分个八层”,每层都含有原图的部分信息,编写源代码时,可以去提出或除某一位图,显示出代表的信息。
数字图像处理代码大全
1.图像反转MATLAB程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1); %图像反转线性变换H=uint8(J);subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(H);2.灰度线性变换MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1]subplot(2,2,3),imshow(J);title('线性变换图像[0.1 0.5]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1]subplot(2,2,4),imshow(K);title('线性变换图像[0.3 0.7]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系3.非线性变换MATLAB程序实现如下:I=imread('xian.bmp');I1=rgb2gray(I);subplot(1,2,1),imshow(I1);title('灰度图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系J=double(I1);J=40*(log(J+1));H=uint8(J);subplot(1,2,2),imshow(H);title('对数变换图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系4.直方图均衡化MATLAB程序实现如下:I=imread('xian.bmp');I=rgb2gray(I);figure;subplot(2,2,1);imshow(I);subplot(2,2,2);imhist(I);I1=histeq(I);figure;subplot(2,2,1);imshow(I1);subplot(2,2,2);imhist(I1);5.线性平滑滤波器用MATLAB实现领域平均法抑制噪声程序:I=imread('xian.bmp');subplot(231)imshow(I)title('原始图像')I=rgb2gray(I);I1=imnoise(I,'salt & pepper',0.02);subplot(232)imshow(I1)title('添加椒盐噪声的图像')k1=filter2(fspecial('average',3),I1)/255; %进行3*3模板平滑滤波k2=filter2(fspecial('average',5),I1)/255; %进行5*5模板平滑滤波k3=filter2(fspecial('average',7),I1)/255; %进行7*7模板平滑滤波k4=filter2(fspecial('average',9),I1)/255; %进行9*9模板平滑滤波subplot(233),imshow(k1);title('3*3模板平滑滤波');subplot(234),imshow(k2);title('5*5模板平滑滤波');subplot(235),imshow(k3);title('7*7模板平滑滤波');subplot(236),imshow(k4);title('9*9模板平滑滤波'); 6.中值滤波器用MATLAB实现中值滤波程序如下:I=imread('xian.bmp');I=rgb2gray(I);J=imnoise(I,'salt&pepper',0.02);subplot(231),imshow(I);title('原图像');subplot(232),imshow(J);title('添加椒盐噪声图像');k1=medfilt2(J); %进行3*3模板中值滤波k2=medfilt2(J,[5,5]); %进行5*5模板中值滤波k3=medfilt2(J,[7,7]); %进行7*7模板中值滤波k4=medfilt2(J,[9,9]); %进行9*9模板中值滤波subplot(233),imshow(k1);title('3*3模板中值滤波'); subplot(234),imshow(k2);title('5*5模板中值滤波'); subplot(235),imshow(k3);title('7*7模板中值滤波'); subplot(236),imshow(k4);title('9*9模板中值滤波'); 7.用Sobel算子和拉普拉斯对图像锐化:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,2,2),imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系H=fspecial('sobel'); %选择sobel算子J=filter2(H,I1); %卷积运算subplot(2,2,3),imshow(J);title('sobel算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子J1=conv2(I1,h,'same'); %卷积运算subplot(2,2,4),imshow(J1);title('拉普拉斯算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系8.梯度算子检测边缘用MATLAB实现如下:I=imread('xian.bmp');subplot(2,3,1);imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,3,2);imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=edge(I1,'roberts');figure;subplot(2,3,3);imshow(I2);title('roberts算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=edge(I1,'sobel');subplot(2,3,4);imshow(I3);title('sobel算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I4=edge(I1,'Prewitt');subplot(2,3,5);imshow(I4);title('Prewitt算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系9.LOG算子检测边缘用MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像');I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'log');subplot(2,2,3);imshow(I2);title('log算子分割结果'); 10.Canny算子检测边缘用MATLAB程序实现如下:I=imread('xian.bmp'); subplot(2,2,1);imshow(I);title('原始图像')I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'canny'); subplot(2,2,3);imshow(I2);title('canny算子分割结果');11.边界跟踪(bwtraceboundary函数)clcclear allI=imread('xian.bmp');figureimshow(I);title('原始图像');I1=rgb2gray(I); %将彩色图像转化灰度图像threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限BW=im2bw(I1, threshold); %将灰度图像转化为二值图像figureimshow(BW);title('二值图像');dim=size(BW);col=round(dim(2)/2)-90; %计算起始点列坐标row=find(BW(:,col),1); %计算起始点行坐标connectivity=8;num_points=180;contour=bwtraceboundary(BW,[row,col],'N',connectivity,num_p oints);%提取边界figureimshow(I1);hold on;plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2); title('边界跟踪图像');12.Hough变换I= imread('xian.bmp');rotI=rgb2gray(I);subplot(2,2,1);imshow(rotI);title('灰度图像');axis([50,250,50,200]);grid on;axis on;BW=edge(rotI,'prewitt');subplot(2,2,2);imshow(BW);title('prewitt算子边缘检测后图像');axis([50,250,50,200]);grid on;axis on;[H,T,R]=hough(BW);subplot(2,2,3);imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); title('霍夫变换图');xlabel('\theta'),ylabel('\rho');axis on , axis normal, hold on;P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));x=T(P(:,2));y=R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); subplot(2,2,4);,imshow(rotI);title('霍夫变换图像检测');axis([50,250,50,200]);grid on;axis on;hold on;max_len=0;for k=1:length(lines)xy=[lines(k).point1;lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');len=norm(lines(k).point1-lines(k).point2);if(len>max_len)max_len=len;xy_long=xy;endendplot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan'); 13.直方图阈值法用MATLAB实现直方图阈值法:I=imread('xian.bmp');I1=rgb2gray(I);figure;subplot(2,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系[m,n]=size(I1); %测量图像尺寸参数GP=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255GP(k+1)=length(find(I1==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置endsubplot(2,2,2),bar(0:255,GP,'g') %绘制直方图title('灰度直方图')xlabel('灰度值')ylabel('出现概率')I2=im2bw(I,150/255);subplot(2,2,3),imshow(I2);title('阈值150的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=im2bw(I,200/255); %subplot(2,2,4),imshow(I3);title('阈值200的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系14. 自动阈值法:Otsu法用MATLAB实现Otsu算法:clcclear allI=imread('xian.bmp');subplot(1,2,1),imshow(I);title('原始图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系level=graythresh(I); %确定灰度阈值BW=im2bw(I,level);subplot(1,2,2),imshow(BW);title('Otsu法阈值分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系15.膨胀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀subplot(1,2,2);imshow(I2);title('膨胀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系16.腐蚀操作MATLAB实现腐蚀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀subplot(1,2,2);imshow(I2);title('腐蚀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系17.开启和闭合操作用MATLAB实现开启和闭合操作I=imread('xian.bmp'); %载入图像subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1); %采用半径为1的圆作为结构元素I3=imclose(I1,se); %闭合操作subplot(2,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(2,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系18.开启和闭合组合操作I=imread('xian.bmp'); %载入图像subplot(3,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(3,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I3=imclose(I1,se); %闭合操作subplot(3,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(3,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I4=imopen(I1,se);I5=imclose(I4,se);subplot(3,2,5),imshow(I5); %开—闭运算图像title('开—闭运算图像');axis([50,250,50,200]);axis on; %显示坐标系I6=imclose(I1,se);I7=imopen(I6,se);subplot(3,2,6),imshow(I7); %闭—开运算图像title('闭—开运算图像');axis([50,250,50,200]);axis on; %显示坐标系19.形态学边界提取利用MATLAB实现如下:I=imread('xian.bmp'); %载入图像subplot(1,3,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(1,3,2),imshow(I1);title('二值化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=bwperim(I1); %获取区域的周长subplot(1,3,3),imshow(I2);title('边界周长的二值图像');axis([50,250,50,200]);grid on;axis on;20.形态学骨架提取利用MATLAB实现如下:I=imread('xian.bmp'); subplot(2,2,1),imshow(I); title('原始图像');axis([50,250,50,200]); axis on;I1=im2bw(I);subplot(2,2,2),imshow(I1); title('二值图像');axis([50,250,50,200]); axis on;I2=bwmorph(I1,'skel',1); subplot(2,2,3),imshow(I2); title('1次骨架提取');axis([50,250,50,200]); axis on;I3=bwmorph(I1,'skel',2); subplot(2,2,4),imshow(I3); title('2次骨架提取');axis([50,250,50,200]); axis on;21.直接提取四个顶点坐标I = imread('xian.bmp');I = I(:,:,1);BW=im2bw(I);figureimshow(~BW)[x,y]=getpts。
数字图像处理MATLAB函数源代码
数字图像处理MATLAB函数源代码MATLAB函数源代码function varargout = DIP(varargin)% DIP MATLAB code for DIP.fig% DIP, by itself, creates a new DIP or raises the existing % singleton*.%% Edit the above text to modify the response to help DIP % Last Modified by GUIDE v2.5 27-May-2012 11:43:05 gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @DIP_OpeningFcn, ...'gui_OutputFcn', @DIP_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1}); endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State,varargin{:});elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before DIP is made visible. functionDIP_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to DIP (see VARARGIN)% Choose default command line output for DIPhandles.output = hObject;% Update handles structureguidata(hObject, handles);% UIWAIT makes DIP wait for user response (see UIRESUME) %uiwait(handles.DIP);set(handles.Menu2,'Enable','off');% 在打开图片前其他下拉菜单不可用set(handles.Menu3,'Enable','off');set(handles.Menu4,'Enable','off');set(handles.Menu5,'Enable','off');set(handles.Menu6,'Enable','off');set(handles.Menu7,'Enable','off');set(handles.Menu8,'Enable','off');set(handles.Menu9,'Enable','off');setappdata(handles.DIP, 'IM', 0);% --- Outputs from this function are returned to the command line. function varargout = DIP_OutputFcn(hObject, eventdata, handles) %varargout cell array for returning output args (see VARARGOUT); %hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output;% --- Executes on button press in file_open.function file_open_Callback(hObject, eventdata, handles) % hObject handle to file_open (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM %定义一个全局变量im[filename,pathname]=uigetfile({'*.bmp';'*.tif';'*.png';'*.jpg'},'select picture');%选择图片路径if isequal(filename,0) || isequal(pathname,0),return;endstr=[pathname filename]; %合成路径+文件名IM=imread(str); %读取图片axes(handles.axes1); %使用第一个axesimshow(IM); %显示图片%axes(handles.axes2);%cla reset;set(handles.Menu2,'Enable','on');% 在打开图片后其他下拉菜单可用set(handles.Menu3,'Enable','on');set(handles.Menu4,'Enable','on');set(handles.Menu5,'Enable','on');set(handles.Menu6,'Enable','on');set(handles.Menu7,'Enable','on');set(handles.Menu8,'Enable','on');set(handles.Menu9,'Enable','on');setappdata(handles.DIP, 'IM', IM);%--------------------------------------------------------------------function Menu1_Callback(hObject, eventdata, handles) % hObject handle to Menu1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu1_1_Callback(hObject, eventdata, handles) % hObject handle to Menu1_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)global IM %定义一个全局变量IM[filename,pathname]=uigetfile({'*.bmp';'*.tif';'*.png';'*.jpg'},'sel ect picture'); %选择图片路径if isequal(filename,0) || isequal(pathname,0),return;endstr=[pathname filename]; %合成路径+文件名IM=imread(str); %读取图片axes(handles.axes1); %使用第一个axesimshow(IM); %显示图片%axes(handles.axes2);%cla reset;set(handles.Menu2,'Enable','on');% 在打开图片后其他下拉菜单可用set(handles.Menu3,'Enable','on');set(handles.Menu4,'Enable','on');set(handles.Menu5,'Enable','on');set(handles.Menu6,'Enable','on');set(handles.Menu7,'Enable','on');set(handles.Menu8,'Enable','on');set(handles.Menu9,'Enable','on');setappdata(handles.DIP, 'IM', IM);%--------------------------------------------------------------------function Menu1_2_Callback(hObject, eventdata, handles) % hObject handle to Menu1_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global BW %定义处理后的图片BW这个全局变量[filename,pathname,filterindex]=...uiputfile({'*.bmp';'*.tif';'*.png';'*.jpg'},'save picture');%存储图片路径if filterindex==0return %如果取消操作,返回elsestr=[pathname filename]; %合成路径+文件名axes(handles.axes2); %使用第二个axes imwrite(BW,str); %写入图片信息,即保存图片end%--------------------------------------------------------------------function Menu1_3_Callback(hObject, eventdata, handles) % hObject handle to Menu1_3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) close(gcf) %关闭当前Figure窗口句柄%--------------------------------------------------------------------function Menu1_4_Callback(hObject, eventdata, handles) % hObject handle to Menu1_4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;axes(handles.axes2);imshow(IM);[filename,pathname,filterindex]=...uiputfile({'*.bmp';'*.tif';'*.png';'*.jpg'},'save picture');if filterindex==0returnelsestr=[pathname filename];axes(handles.axes2);imwrite(IM,str); %写入图片信息,即保存图片end%--------------------------------------------------------------------function Menu2_Callback(hObject, eventdata, handles) % hObject handle to Menu4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)%--------------------------------------------------------------------function Menu2_1_Callback(hObject, eventdata, handles) % hObject handle to Menu2_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu2_1_1_Callback(hObject, eventdata, handles) % hObject handle to Menu2_1_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW=imresize(IM,0.3,'nearest');axes(handles.axes2);imshow(BW,[]);%--------------------------------------------------------------------function Menu2_1_2_Callback(hObject, eventdata, handles) % hObject handle to Menu2_1_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW=imresize(IM,0.1,'bilinear');axes(handles.axes2);imshow(BW,[]);%--------------------------------------------------------------------function Menu2_1_3_Callback(hObject, eventdata, handles) % hObject handle to Menu2_1_3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW=imresize(IM,0.1,'bicubic');axes(handles.axes2);imshow(BW,[]);%--------------------------------------------------------------------function Menu2_2_Callback(hObject, eventdata, handles) % hObject handle to Menu2_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;H=rotate;%--------------------------------------------------------------------function Menu2_3_Callback(hObject, eventdata, handles) % hObject handle to Menu2_3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;set(handles.main_txt, 'FontName', '宋体' );set(handles.main_txt, 'String', '请选择要裁剪的局域,并双击选定区域以显示~');waitforbuttonpress;BW=imcrop(IM);axes(handles.axes2);imshow(BW);set(handles.main_txt, 'FontName', 'Calibri');set(handles.main_txt, 'String', 'Welcome!');%--------------------------------------------------------------------function Menu2_4_Callback(hObject, eventdata, handles) % hObject handle to Menu2_4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu2_4_1_Callback(hObject, eventdata, handles) % hObject handle to Menu2_4_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;snoise = 0.15*randn(size(IM));BW = imadd(IM, im2uint8(snoise));axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu2_4_2_Callback(hObject, eventdata, handles) % hObject handle to Menu2_4_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = imnoise(IM,'salt & pepper',0.05);axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu2_5_Callback(hObject, eventdata, handles) % hObject handle to Menu2_5 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;len = 25;theta = 35;PSF = fspecial('motion', len, theta);BW = imfilter(IM, PSF, 'circular', 'conv');axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu2_6_Callback(hObject, eventdata, handles) % hObject handle to Menu2_6 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)set(handles.main_txt, 'FontName', '宋体' );set(handles.main_txt, 'String', '请用鼠标选择任意几个像素点后按回车以显示所选像素点的数据值~');vals=impixel;set(handles.main_txt, 'FontName', 'Calibri');set(handles.main_txt, 'String', 'Welcome!');%--------------------------------------------------------------------function Menu2_7_Callback(hObject, eventdata, handles) % hObject handle to Menu2_7 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)set(handles.main_txt, 'FontName', '宋体' );set(handles.main_txt, 'String', '请用鼠标选择一线段后按回车以显示轨迹强度图~');axes(handles.axes1);improfile;%c = improfile;%axes(handles.axes2);%imshow(c);set(handles.main_txt, 'FontName', 'Calibri');set(handles.main_txt, 'String', 'Welcome!');%--------------------------------------------------------------------function Menu2_8_Callback(hObject, eventdata, handles) % hObject handle to Menu2_8 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;[counts,x]=imhist(IM,64);axes(handles.axes2);stem(x,counts,'k-','k.');%--------------------------------------------------------------------function Menu4_Callback(hObject, eventdata, handles) % hObject handle to Menu4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu4_1_Callback(hObject, eventdata, handles) % hObject handle to Menu4_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = imadjust(IM);axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu4_2_Callback(hObject, eventdata, handles) % hObject handle to Menu4_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu4_2_1_Callback(hObject, eventdata, handles) % hObject handle to Menu4_2_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = histeq(IM);axes(handles.axes2);imshow(BW);figure(1);subplot(1,2,1);imhist(IM);title('原始图像直方图');subplot(1,2,2);imhist(BW); title('直方图均衡化后图像直方图');%--------------------------------------------------------------------function Menu4_2_2_Callback(hObject, eventdata, handles) % hObject handle to Menu4_2_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;hgram = ones(1,256);BW = histeq(IM,hgram);axes(handles.axes2);imshow(BW);figure(2);subplot(1,2,1);imhist(IM);title('原始图像直方图');subplot(1,2,2);imhist(BW); title('直方图规定化后图像直方图');%--------------------------------------------------------------------function Menu4_3_Callback(hObject, eventdata, handles) % hObject handle to Menu4_3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu4_3_1_Callback(hObject, eventdata, handles) % hObject handle to Menu4_3_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;h = [1 1 1;1 0 1;1 1 1];% 8邻域平均滤波h = h/8;BW = conv2(IM, h);axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu4_3_2_Callback(hObject, eventdata, handles) % hObject handle to Menu4_3_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = medfilt2(IM); %用于3*3滤波窗口对图像进行中值滤波处理 %若用[m,n], K = medfilt2(IM, [m,n])axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu4_3_3_Callback(hObject, eventdata, handles) % hObject handle to Menu4_3_3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;[f1,f2] = freqspace(size(IM),'meshgrid'); 生成频率序列矩阵 Hd = ones(size(IM)); %构造滤波器大小r = sqrt(f1.^2 + f2.^2); %构造滤波器决策函数Hd(r>0.5) = 0; %构造滤波器,半径r>0.5Y = fft2(double(IM)); %对I进行傅里叶变换Y = fftshift(Y); %频谱平移Ya = Y.*Hd; %滤波Ya = ifftshift(Ya); %反变换BW = ifft2(Ya);axes(handles.axes2);imshow(uint8(BW));%--------------------------------------------------------------------function Menu4_4_Callback(hObject, eventdata, handles) % hObject handle to Menu4_4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu4_4_1_Callback(hObject, eventdata, handles) % hObject handle to Menu4_4_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;h = [-1,-1,-1;-1,9,-1;-1,-1,-1];% 八领域BW = imfilter(IM,h);axes(handles.axes2);imshow(uint8(BW));%--------------------------------------------------------------------function Menu4_4_2_Callback(hObject, eventdata, handles) % hObject handle to Menu4_4_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;[f1,f2] = freqspace(size(IM),'meshgrid');% 生成频率序列矩阵 Hd = ones(size(IM)); %构造滤波器大小r = sqrt(f1.^2 + f2.^2); %构造滤波器决策函数Hd(r<0.1) = 0; %构造滤波器,半径r<0.1Y = fft2(double(IM)); %对I进行傅里叶变换Y = fftshift(Y); %频谱平移Ya = Y.*Hd; %滤波Ya = ifftshift(Ya); %反变换BW = ifft2(Ya);axes(handles.axes2);imshow(uint8(BW));%--------------------------------------------------------------------function Menu5_3_1_Callback(hObject, eventdata, handles) % hObject handle to Menu5_3_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = edge(IM,'roberts');axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu5_3_2_Callback(hObject, eventdata, handles) % hObject handle to Menu5_3_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = edge(IM,'sobel');axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu5_3_3_Callback(hObject, eventdata, handles) % hObject handle to Menu5_3_3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = edge(IM,'prewitt');axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu5_3_4_Callback(hObject, eventdata, handles) % hObject handle to Menu5_3_4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = edge(IM,'canny');axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu5_3_5_Callback(hObject, eventdata, handles) % hObject handle to Menu5_3_5 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = edge(IM,'zerocross');axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu5_4_Callback(hObject, eventdata, handles) % hObject handle to Menu5_4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu5_5_Callback(hObject, eventdata, handles) % hObject handle to Menu5_5 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu6_Callback(hObject, eventdata, handles) % hObject handle to Menu6 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu6_1_Callback(hObject, eventdata, handles) % hObject handle to Menu6_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;len = 25;theta = 35;PSF = fspecial('motion', len, theta);BW = deconvwnr(IM, PSF);axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu7_2_2_Callback(hObject, eventdata, handles) % hObject handle to Menu7_2_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = rgb2gray(IM);axes(handles.axes2);imshow(BW);%--------------------------------------------------------------------function Menu7_2_3_Callback(hObject, eventdata, handles) % hObject handle to Menu7_2_3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------------------------------------------------------------------function Menu7_2_4_Callback(hObject, eventdata, handles) % hObject handle to Menu7_2_4 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global IM;global BW;BW = rgb2gray(IM);axes(handles.axes2);imshow(BW);colormap(jet);%设置色彩索引。
数字图像处理 实验代码
subplot(2,2,3),imshow(J);
title('线性变换图像[0.1 0.5]');
axis([50,250,50,200]);
grid on; %显示网格线
axis on; %显示坐标系
K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1]
%g(mx+1:m,my+1:n,1:x)=f(1:m-mx,1:n-my ,1:x); g(1:m-mx,1:n-my ,1:x)=f(mx+1:m,my+1:n,1:x); figure; imshow(uint8(g));
end
3. f=imread('hehua1.bmp'); [m,n]=size(f); for i=50:10:200 m=i; n=i; f2=imcrop(f,[n,n,m,m]); figure; imshow(uint8(f2)); end
(4) 图像旋转imrotate函数,语法格式为: B = imrotate(A,angle,’crop’),参数crop用于指定裁剪旋转后超出图像的部分。
三、实验内容 (1) 将图像hehua.bmp裁剪成200X200大小 (2) 制作动画,将一幅图像逐渐向左上角平移移出图像区域,空白的地方用白色 填充 (3) 利用剪切图像函数制作动画 (4) 将图像分别放大1.5倍和缩小0.8倍,插值方法使用双线性插值法,分别显 示图像。 (5) 将图像水平镜像,再顺时针旋转45度,显示旋转后的图像。 (6) 将图像分别进行水平方向30度错切,垂直方向45度错切,分别显示结果 四、 实验环境 Windows下matlab编程环境
数字图像处理:图像分割
数字图像处理:图像分割数字图像处理:图像分割前⾔:这个实验分成两部分代码,分别对应1和21. 膨胀:将与⽬标区域的背景点合并到该⽬标物中,使⽬标物边界向外部扩张的处理,把⼆值图像各1像素连接成分的边界扩⼤⼀层。
具体操作为:图像中关⼼的像素(结构元素B中值为1的部分)有1,则结果赋值为1,没有1,则赋值0。
腐蚀:消除连通域的边界点,使边界向内收缩的处理。
贴标签是对不同连通域区分和标记的基本算法,把⼆值图像各1像素连接成分的边界点去掉从⽽缩⼩⼀层。
2. 开操作:先腐蚀再膨胀,可以去掉⽬标外的孤⽴点闭操作:先膨胀再腐蚀,可以去掉⽬标内的孔。
注:别忘了图⽚的路径改成⾃⼰的⼀、实验⽬的理解和掌握图像分割的基本理论和算法,练习使⽤形态学、区域、边界和阈值的⽅法结合图像增强复原的相关知识对图像进⾏分割处理。
⼆、实验内容1.读⼊⼀幅图像,对图像进⾏如下操作:(1) ⽤膨胀腐蚀等形态学⽅法对图像进⾏去噪、增强处理。
改变结构元素,观察处理后的图像是否有明显的差别。
(2) ⽤开操作和闭操作等形态学⽅法去除指纹图像中的细⼩颗粒,连接断裂的指纹。
(3) 在上⼀步⽤形态学⽅法处理后的指纹图像基础上,运⽤全局阈值实现图像的⼆值化。
2.读⼊⼀幅图像,利⽤边缘检测和分⽔岭⽅法(watershed)对图像进⾏前景分割。
在调⽤watershed函数前,利⽤prewitt算⼦或者全局阈值等⽅法增强图像边缘。
实验结果图如下:1. 第⼀部分实验结果(两种图⽚来观察结果,此外我在作腐蚀时改变了两种结构元素来进⾏观察)2. 第⼆部分实验结果(两种图⽚来观察结果):代码如下:###### 第⼀部分代码%⼿动实现膨胀和腐蚀%img=imread('finger_noise.tif');img=im2bw(imread('test.png'));figure('name','实验结果');number=5;% 定义number⾏图⽚subplot(number,3,1);imshow(img);title('原图');subplot(number,3,4);imshow(img);title('原图');subplot(number,3,7);imshow(img);title('原图');B=[0 1 01 1 10 1 0]; %结构元素[row,col]=size(img);%获得图像的⾼和宽%对img进⾏膨胀imgdilate=img;for i=2:row-1for j=2:col-1pitch=img(i-1:i+1,j-1:j+1);convtmp= pitch.*B; %⽤img中的⼀块与结构元素作卷积if sum(convtmp(:))>0imgdilate(i,j)=1;%⾮零则赋值1elseimgdilate(i,j)=0;%零则仍赋值0endendendsubplot(number,3,2);imshow(imgdilate);title('膨胀后结果');%对img进⾏腐蚀imgerode=img;C=sum(B(:)); %结构元素B中关⼼的元素个数for i=2:row-1for j=2:col-1pitch=img(i-1:i+1,j-1:j+1);convtmp= pitch.*B; %⽤img中的⼀块与结构元素作卷积if sum(convtmp(:))<Cimgerode(i,j)=0;elseimgerode(i,j)=1;endendendsubplot(number,3,3);imshow(imgerode);title('腐蚀后结果');B= [1 1 1;1 1 1;1 1 1]%更改结构元素[1 1 1;1 1 1;1 1 1],[1 0 1;0 1 0;1 0 1] %开操作(对腐蚀后的图像再进⾏⼀次膨胀)imgopen=imgerode;for i=2:row-1for j=2:col-1pitch=imgerode(i-1:i+1,j-1:j+1);convtmp= pitch.*B; %⽤img中的⼀块与结构元素作卷积if sum(convtmp(:))>0 %⾮零则赋值1imgopen(i,j)=1;elseimgopen(i,j)=0;%零则仍赋值0endendendsubplot(number,3,5);imshow(imgopen);title('开操作后结果,结构元素为[1 1 1;1 1 1;1 1 1]');%闭操作(对膨胀后的图像再进⾏⼀次腐蚀)imgclose=imgdilate;C=sum(B(:)); %结构元素B中关⼼的元素个数for i=2:row-1for j=2:col-1pitch=imgdilate(i-1:i+1,j-1:j+1);convtmp= pitch.*B; %⽤img中的⼀块与结构元素作卷积if sum(convtmp(:))<Cimgclose(i,j)=0;elseimgclose(i,j)=1;endendendsubplot(number,3,6);imshow(imgclose);title('闭操作后结果,结构元素为[1 1 1;1 1 1;1 1 1]');B= [1 0 1;0 1 0;1 0 1]%更改结构元素[1 1 1;1 1 1;1 1 1],[1 0 1;0 1 0;1 0 1] %开操作(对腐蚀后的图像再进⾏⼀次膨胀)imgopen=imgerode;for i=2:row-1for j=2:col-1pitch=imgerode(i-1:i+1,j-1:j+1);convtmp= pitch.*B; %⽤img中的⼀块与结构元素作卷积if sum(convtmp(:))>0 %⾮零则赋值1imgopen(i,j)=1;elseimgopen(i,j)=0;%零则仍赋值0endendendsubplot(number,3,8);imshow(imgopen);title('开操作后结果,结构元素为[1 0 1;0 1 0;1 0 1]');%闭操作(对膨胀后的图像再进⾏⼀次腐蚀)imgclose=imgdilate;C=sum(B(:)); %结构元素B中关⼼的元素个数for i=2:row-1for j=2:col-1pitch=imgdilate(i-1:i+1,j-1:j+1);convtmp= pitch.*B; %⽤img中的⼀块与结构元素作卷积if sum(convtmp(:))<Cimgclose(i,j)=0;elseimgclose(i,j)=1;endendendsubplot(number,3,9);imshow(imgclose);title('闭操作后结果,结构元素为[1 0 1;0 1 0;1 0 1]');subplot(number,3,10);imshow(imgdilate);title('原图');%确定全局阈值TT=0.5*(double(min(imgdilate(:)))+double(max(imgdilate(:))));%设置初始阈值为最⼤灰度和最⼩灰度值和的⼀半done=false;while ~doneg=imgdilate>=T;%分成两组像素,灰度值⼤于或者等于T的和灰度值⼩于T的Tnext=0.5*(mean(imgdilate(g))+mean(imgdilate(~g)));%新阈值两个范围内像素平均值和的⼀半done=abs(T-Tnext)<0.5; %0.5是⾃⼰指定的参数T=Tnext;endimout2=im2bw(imgdilate,T);subplot(number,3,11);imshow(imout2);title('膨胀后全局⼆值化');%确定全局阈值TT=0.5*(double(min(imgerode(:)))+double(max(imgerode(:))));%设置初始阈值为最⼤灰度和最⼩灰度值和的⼀半done=false;while ~doneg=imgerode>=T;%分成两组像素,灰度值⼤于或者等于T的和灰度值⼩于T的Tnext=0.5*(mean(imgerode(g))+mean(imgerode(~g)));%新阈值两个范围内像素平均值和的⼀半done=abs(T-Tnext)<0.5; %0.5是⾃⼰指定的参数T=Tnext;endimout3=im2bw(imgerode,T);subplot(number,3,12);imshow(imout3);title('腐蚀后全局⼆值化');第⼆部分代码%pic =imread('finger.tif')pic =imread('rice.tif')number=2subplot(number,3,1);imshow(pic);title('原图');% 使⽤prewitt算⼦增强G=imfilter(pic,fspecial('prewitt'));%⽣成’prewitt’模板,并对输⼊图像做边缘增强,再加上原图像subplot(number,3,2);imshow(G);title('prewitt算⼦增强后图像');L=watershed(G); %分⽔岭算法wr=L==0; %取出边缘subplot(number,3,3);imshow(wr);title('分⽔岭');pic(wr)=255;subplot(number,3,5);imshow(uint8(pic));title('前景分割结果');。
数字图像处理及matlab实现源代码【1】
数字图像处理及matlab实现源代码【1】% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-*%{% (一)图像文件的读/写A=imread('drum.jpg'); % 读入图像imshow(A); % 显示图像imwrite(A,'drum.jpg');info=imfinfo('drum.jpg') % 查询图像文件信息% 用colorbar函数将颜色条添加到坐标轴对象中RGB=imread('drum.jpg');I=rgb2gray(RGB); % 把RGB图像转换成灰度图像h=[1 2 1;0 0 0;-1 -2 -1];I2=filter2(h,I);imshow(I2,[]);colorbar('vert') % 将颜色条添加到坐标轴对象中% wrap函数将图像作为纹理进行映射A=imread('4.jpg');imshow(A);I=rgb2gray(RGB);[x,y,z]=sphere;warp(x,y,z,I); % 用warp函数将图像作为纹理进行映射%}% subimage函数实现一个图形窗口中显示多幅图像RGB=imread('drum.jpg');I=rgb2gray(RGB);subplot(1,2,1);subimage(RGB); % subimage函数实现一个图形窗口中显示多幅图像subplot(1,2,2),subimage(I);% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-*% (二)图像处理的基本操作% ----------------图像代数运算------------------%{% imadd函数实现两幅图像的相加或给一幅图像加上一个常数% 给图像每个像素都增加亮度I=imread('4.jpg');J=imadd(I,100); % 给图像增加亮度subplot(1,2,1),imshow(I);title('原图');subplot(1,2,2),imshow(J);title('增加亮度图');%% imsubtract函数实现将一幅图像从另一个图像中减去或减去一个常数I=imread('drum.jpg');J=imsubtract(I,100); % 给图像减去亮度subplot(1,2,1),imshow(I);%% immultiply实现两幅图像的相乘或者一幅图像的亮度缩放I=imread('drum.jpg');J=immultiply(I,2); % 进行亮度缩放subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%% imdivide函数实现两幅图像的除法或一幅图像的亮度缩放I=imread('4.jpg');J=imdivide(I,0.5); % 图像的亮度缩放subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%}% ----------------图像的空间域操作------------------%{% imresize函数实现图像的缩放J=imread('4.jpg');subplot(1,2,1),imshow(J);title('原图');X1=imresize(J,0.2); % 对图像进行缩放subplot(1,2,2),imshow(X1);title('缩放图');%% imrotate函数实现图像的旋转I=imread('drum.jpg');J=imrotate(I,50,'bilinear'); % 对图像进行旋转subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%% imcrop函数实现图像的剪切I=imread('drum.jpg');I2=imcrop(I,[1 100 130 112]); % 对图像进行剪切subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(I2);%}% ----------------特定区域处理------------------%{% roipoly函数用于选择图像中的多边形区域I=imread('4.jpg');c=[200 250 278 248 199 172];r=[21 21 75 121 121 75];BW=roipoly(I,c,r); % roipoly函数选择图像中的多边形区域subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(BW);%% roicolor函数式对RGB图像和灰度图像实现按灰度或亮度值选择区域进行处理a=imread('4.jpg');subplot(2,2,1),imshow(a);I=rgb2gray(a);BW=roicolor(I,128,225); % 按灰度值选择的区域subplot(2,2,4),imshow(BW);%% ploy2mask 函数转化指定的多边形区域为二值掩模x=[63 186 54 190 63];y=[60 60 209 204 601];bw=poly2mask(x,y,256,256); % 转化指定的多边形区域为二值掩模imshow(bw);hold onplot(x,y,'r','LineWidth',2);hold off%% roifilt2函数实现区域滤波a=imread('4.jpg');I=rgb2gray(a);c=[200 250 278 248 199 172];r=[21 21 75 121 121 75];BW=roipoly(I,c,r); % roipoly函数选择图像中的多边形区域h=fspecial('unsharp');J=roifilt2(h,I,BW); % 区域滤波subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%% roifill函数实现对特定区域进行填充a=imread('4.jpg');I=rgb2gray(a);c=[200 250 278 248 199 172];r=[21 21 75 121 121 75];J=roifill(I,c,r); % 对特定区域进行填充subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);%}% ----------------图像变换------------------%{% fft2 和ifft2函数分别是计算二维的快速傅里叶变换和反变换f=zeros(100,100);subplot(1,2,1);imshow(f);f(20:70,40:60)=1;subplot(1,2,2);imshow(f);F=fft2(f); % 计算二维的快速傅里叶变换F2=log(abs(F));% 对幅值对对数figure;subplot(1,2,1),imshow(F),colorbar;subplot(1,2,2),imshow(F2),colorbar;%% fftsshift 函数实现了补零操作和改变图像显示象限f=zeros(100,100);subplot(2,2,1),imshow(f);title('f')f(10:70,40:60)=1;subplot(2,2,2),imshow(f);title('f取后')F=fft2(f,256,256);subplot(2,2,3),imshow(F);title('F')F2=fftshift(F); % 实现补零操作subplot(2,2,4),imshow(F2);title('F2')figure,imshow(log(abs(F2)));title('log(|F2|)')%% dct2 函数采用基于快速傅里叶变换的算法,用于实现较大输入矩阵的离散余弦变换% idct2 函数实现图像的二维逆离散余弦变换RGB=imread('drum.jpg');I=rgb2gray(RGB);J=dct2(I); % 对I进行离散余弦变换imshow(log(abs(J))),title('对原图离散后取对数'),colorbar; J(abs(J)<10)=0;K=idct2(J); % 图像的二维逆离散余弦变换figure,imshow(I),title('原灰度图')figure,imshow(K,[0,255]);title('逆离散变换');%% dctmtx 函数用于实现较小输入矩阵的离散余弦变figure;RGB=imread('4.jpg');I=rgb2gray(RGB);subplot(3,2,1),imshow(I),title('原灰度图');I=im2double(I);subplot(3,2,2),imshow(I),title('取双精度后');T=dctmtx(8); % 离散余弦变换subplot(3,2,3),imshow(I),title('离散余弦变换后');B=blkproc(I,[8,8],'P1*x*P2',T,T');subplot(3,2,4),imshow(B),title('blkproc作用I后的B'); 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);subplot(3,2,5),imshow(B2),title('blkproc作用B后的B2'); I2=blkproc(B2,[8,8],'P1*x*P2',T',T);subplot(3,2,6),imshow(I2),title('blkproc作用B2后的I2');%% edge函数用于提取图像的边缘RGB=imread('4.jpg');I=rgb2gray(RGB);BW=edge(I);imshow(I);figure,imshow(BW);%% radon 函数用来计算指定方向上图像矩阵的投影RGB=imread('4.jpg');I=rgb2gray(RGB);BW=edge(I);theta=0:179;[R,XP]=radon(BW,theta); % 图像矩阵的投影figure,imagesc(theta,XP,R);colormap(hot);xlabel('\theta(degrees)');ylabel('x\prime');title('R_{\theta}(x\prime)');colorbar;%}% ----------------图像增强、分割和编码------------------%{% imhist 函数产生图像的直方图A=imread('4.jpg');B=rgb2gray(A);subplot(2,1,1),imshow(B);subplot(2,1,2),imhist(B);%% histeq 函数用于对图像的直方图均衡化A=imread('4.jpg');B=rgb2gray(A);subplot(2,1,1),imshow(B);subplot(2,1,2),imhist(B);C=histeq(B); % 对图像B进行均衡化figure;subplot(2,1,1),imshow(C);subplot(2,1,2),imhist(C);%% filter2 函数实现均值滤波a=imread('4.jpg');I=rgb2gray(a);subplot(2,2,1),imshow(I);K1=filter2(fspecial('average',3),I)/255; % 3*3的均值滤波K2=filter2(fspecial('average',5),I)/255; % 5*5的均值滤波K3=filter2(fspecial('average',7),I)/255; % 7*7的均值滤波subplot(2,2,2),imshow(K1);subplot(2,2,3),imshow(K2);subplot(2,2,4),imshow(K3);%% wiener2 函数实现Wiener(维纳)滤波a=imread('4.jpg');I=rgb2gray(a);subplot(2,2,1),imshow(I);K1=wiener2(I,[3,3]); % 3*3 wiener滤波K2=wiener2(I,[5,5]); % 5*5 wiener滤波K3=wiener2(I,[7,7]); % 7*7 wiener滤波subplot(2,2,2),imshow(K1);subplot(2,2,3),imshow(K2);subplot(2,2,4),imshow(K3);%% medfilt2 函数实现中值滤波a=imread('4.jpg');I=rgb2gray(a);subplot(2,2,1),imshow(I);K1=medfilt2(I,[3,3]); % 3*3 中值滤波K2=medfilt2(I,[5,5]); % 5*5 中值滤波K3=medfilt2(I,[7,7]); % 7*7 中值滤波subplot(2,2,2),imshow(K1);subplot(2,2,3),imshow(K2);subplot(2,2,4),imshow(K3);%}% ----------------图像模糊及复原------------------%{% deconvwnr 函数:使用维纳滤波器I=imread('qier.jpg');imshow(I);% 对图像进行模糊处理LEN=31;THETA=11;PSF1=fspecial('motion',LEN,THETA); % 运动模糊PSF2=fspecial('gaussian',10,5); % 高斯模糊Blurred1=imfilter(I,PSF1,'circular','conv'); % 得到运动模糊图像Blurred2=imfilter(I,PSF2,'conv'); % 得到高斯噪声模糊图像figure;subplot(1,2,1);imshow(Blurred1);title('Blurred1--"motion"'); subplot(1,2,2);imshow(Blurred2);title('Blurred2--"gaussian"');% 对模糊图像加噪声V=0.002;BlurredNoisy1=imnoise(Blurred1,'gaussian',0,V); % 加高斯噪声BlurredNoisy2=imnoise(Blurred2,'gaussian',0,V); % 加高斯噪声figure;subplot(1,2,1);imshow(BlurredNoisy1);title('BlurredNoisy1'); subplot(1,2,2);imshow(BlurredNoisy2);title('BlurredNoisy2');% 进行维纳滤波wnr1=deconvwnr(Blurred1,PSF1); % 维纳滤波wnr2=deconvwnr(Blurred2,PSF2); % 维纳滤波figure;subplot(1,2,1);imshow(wnr1);title('Restored1,True PSF'); subplot(1,2,2);imshow(wnr2);title('Restored2,True PSF');%% deconvreg函数:使用约束最小二乘滤波器I=imread('qier.jpg');imshow(I);% 对图像进行模糊处理LEN=31;THETA=11;PSF1=fspecial('motion',LEN,THETA); % 运动模糊PSF2=fspecial('gaussian',10,5); % 高斯模糊Blurred1=imfilter(I,PSF1,'circular','conv'); % 得到运动模糊图像Blurred2=imfilter(I,PSF2,'conv'); % 得到高斯噪声模糊图像figure;subplot(1,2,1);imshow(Blurred1);title('Blurred1--"motion"');subplot(1,2,2);imshow(Blurred2);title('Blurred2--"gaussian"');% 对模糊图像加噪声V=0.002;BlurredNoisy1=imnoise(Blurred1,'gaussian',0,V); % 加高斯噪声BlurredNoisy2=imnoise(Blurred2,'gaussian',0,V); % 加高斯噪声figure;subplot(1,2,1);imshow(BlurredNoisy1);title('BlurredNoisy1');subplot(1,2,2);imshow(BlurredNoisy2);title('BlurredNoisy2');NP=V*prod(size(I));reg1=deconvreg(BlurredNoisy1,PSF1,NP); % 约束最小二乘滤波reg2=deconvreg(BlurredNoisy2,PSF2,NP); % 约束最小二乘滤波figure;subplot(1,2,1);imshow(reg1);title('Restored1 with NP');subplot(1,2,2);imshow(reg2);title('Restored2 with NP');%% deconvlucy函数:使用Lucy-Richardson滤波器I=imread('qier.jpg');imshow(I);% 对图像进行模糊处理LEN=31;THETA=11;PSF1=fspecial('motion',LEN,THETA); % 运动模糊PSF2=fspecial('gaussian',10,5); % 高斯模糊Blurred1=imfilter(I,PSF1,'circular','conv'); % 得到运动模糊图像Blurred2=imfilter(I,PSF2,'conv'); % 得到高斯噪声模糊图像figure;subplot(1,2,1);imshow(Blurred1);title('Blurred1--"motion"');subplot(1,2,2);imshow(Blurred2);title('Blurred2--"gaussian"');% 对模糊图像加噪声V=0.002;BlurredNoisy1=imnoise(Blurred1,'gaussian',0,V); % 加高斯噪声BlurredNoisy2=imnoise(Blurred2,'gaussian',0,V); % 加高斯噪声figure;subplot(1,2,1);imshow(BlurredNoisy1);title('BlurredNoisy1');subplot(1,2,2);imshow(BlurredNoisy2);title('BlurredNoisy2');luc1=deconvlucy(BlurredNoisy1,PSF1,5); % 使用Lucy-Richardson滤波luc2=deconvlucy(BlurredNoisy1,PSF1,15); % 使用Lucy-Richardson滤波figure;subplot(1,2,1);imshow(luc1);title('RestoredImage,NUMIT=5'); subplot(1,2,2);imshow(luc2);title('Restored Image,NUMIT=15');%}% deconvblind 函数:使用盲卷积算法a=imread('4.jpg');I=rgb2gray(a);figure;imshow(I);title('Original Image');PSF=fspecial('motion',13,45); % 运动模糊figure;imshow(PSF);Blurred=imfilter(I,PSF,'circ','conv'); % 得到运动模糊图像figure;imshow(Blurred);title('Blurred Image');INITPSF=ones(size(PSF));[J,P]=deconvblind(Blurred,INITPSF,30); % 使用盲卷积figure;imshow(J);figure;imshow(P,[],'notruesize');% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-* %{ % 对图像进行减采样a=imread('lena.jpg');%subplot(1,4,1);figure;imshow(a);title('原图');b=rgb2gray(a);%subplot(1,4,2);figure;imshow(b);title('原图的灰度图');[wid,hei]=size(b);%---4倍减采样----quartimg=zeros(wid/2+1,hei/2+1);i1=1;j1=1;for i=1:2:widfor j=1:2:heiquartimg(i1,j1)=b(i,j);j1=j1+1;endi1=i1+1;j1=1;end%subplot(1,4,3);figure;imshow(uint8(quartimg));title('4倍减采样') % ---16倍减采样---quanrtimg=zeros(wid/4+1,hei/4+1);i1=1;j1=1;for i=1:4:widfor j=1:4:heiquanrtimg(i1,j1)=b(i,j);j1=j1+1;endi1=i1+1;j1=1;end%subplot(1,4,4);.figure;imshow(uint8(quanrtimg));title('16倍减采样');%}% 图像类型% 将图像转换为256级灰度图像,64级灰度图像,32级灰度图像,8级灰度图像,2级灰度图像a=imread('4.jpg');%figure;subplot(2,3,1);imshow(a);title('原图');b=rgb2gray(a); % 这是256灰度级的图像%figure;subplot(2,3,2);imshow(b);title('原图的灰度图像');[wid,hei]=size(b);img64=zeros(wid,hei);img32=zeros(wid,hei);img8=zeros(wid,hei);img2=zeros(wid,hei);for i=1:widfor j=j:heiimg64(i,j)=floor(b(i,j)/4); % 转化为64灰度级endend%figure;subplot(2,3,3);imshow(uint8(img64),[0,63]);title('64级灰度图像');for i=1:widfor j=1:heiimg32(i,j)=floor(b(i,j)/8);% 转化为32灰度级endend%figure;subplot(2,3,4);imshow(uint8(img32),[0,31]);title('32级灰度图像');for i=1:widfor j=1:heiimg8(i,j)=floor(b(i,j)/32);% 转化为8灰度级endend%figure;subplot(2,3,5);imshow(uint8(img8),[0,7]);title('8级灰度图像');for i=1:widfor j=1:heiimg2(i,j)=floor(b(i,j)/128);% 转化为2灰度级endend%figure;subplot(2,3,6);imshow(uint8(img2),[0,1]);title('2级灰度图像');% *-*--*-*-*-*-*-*-*-*-*-*-*图像处理*-*-*-*-*-*-*-*-*-*-*-* %{ % ------------------ 图像的点运算------------------I=imread('lena.jpg');figure;subplot(1,3,1);imshow(I);title('原图的灰度图');J=imadjust(I,[0.3;0.6],[0.1;0.9]); % 设置灰度变换的范围subplot(1,3,2);imshow(J);title('线性扩展');I1=double(I); % 将图像转换为double类型I2=I1/255; % 归一化此图像C=2; % 非线性扩展函数的参数K=C*log(1+I2); % 对图像的对数变换subplot(1,3,3);imshow(K);title('非线性扩展');M=255-I;figure;subplot(1,3,1);imshow(M);title('灰度倒置');N1=im2bw(I,0.4); % 将此图像二值化,阈值为0.4N2=im2bw(I,0.7); % 将此图像二值化,阈值为0.7 subplot(1,3,2);imshow(N1);title('二值化阈值0.4');subplot(1,3,3);imshow(N2);title('二值化阈值0.7');%}%{% ------------------ 图像的代数运算------------------% 将两幅图像进行加法运算I=imread('lena.jpg');I=rgb2gray(I);J=imread('rice.png');% 以下把两幅图转化为大小一样for i=1:size(I)for j=size(J):size(I)J(i,j)=0;endendI=im2double(I); % 将图像转化为double型J=im2double(J);% imshow(I);figure;imshow(J);K=I+0.3*J; % 将两幅图像相加subplot(1,3,1);imshow(I);title('人物图');subplot(1,3,2);imshow(J);title('背景图');subplot(1,3,3);imshow(K);title('相加后的图');imwrite(K,'i_lena1.jpg');%%% 将两幅图像做减运算,分离背景与原图A=imread('i_lena1.jpg');B=imread('rice.png');% 以下把两幅图转化为大小一样for i=1:size(A)for j=size(B):size(A)B(i,j)=0;endendC=A-0.3*B;a=imread('lena.jpg');subplot(2,2,1);imshow(a);title('原图图');subplot(2,2,2);imshow(A);title('混合图');subplot(2,2,3);imshow(B);title('背景图');subplot(2,2,4);imshow(C);title('分离后的图');%% 设置掩模,需要保留下来的区域,掩模图像的值为1,否则为0 A=imread('drum.jpg');A=rgb2gray(A);A=im2double(A);sizeA=size(A);subplot(1,2,1);imshow(A);title('原图');B=zeros(sizeA(1),sizeA(2)); % 设置模板B(100:400,100:500)=1;K=A.*B; % 两幅图像相乘subplot(1,2,2);imshow(K);title('局部图');%}%{% ------------------ 图像的缩放------------------A=imread('drum.jpg');B1=imresize(A,1.5); % 比例放大1.5杯,默认采用的是最近邻法进行线性插值B2=imresize(A,[420 384]); % 非比例放大到420:384 C1=imresize(A,0.7); % 比例缩小0.7倍C2=imresize(A,[150 180]); % 非比例缩小到150:180figure;imshow(B1);title('比例放大图');figure;imshow(B2);title('非比例放大图');figure;imshow(C1);title('比例缩小图');figure;imshow(C2);title('非比例缩小图');% 检测非比例缩放得到的图片是否能还原到原图a=size(A)d=imresize(C2,[a(1),a(2)]);figure;imshow(d);%}% ------------------ 图像的旋转------------------I=imread('drum.jpg');J=imrotate(I,45); % 图像进行逆时针旋转,默认采用最近邻插值法进行插值处理K=imrotate(I,90); % 默认旋转出界的部分不被截出subplot(1,3,1);imshow(I);subplot(1,3,2);imshow(J);subplot(1,3,3);imshow(K);% 检测旋转后的图像是否失真P=imrotate(K,270);figure;imshow(P);。
图像分割部分源代码
1.图像反转MATLAB程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1); %图像反转线性变换H=uint8(J);subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(H);2.灰度线性变换MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系J=imadjust(I1,[0.1 0.5],[]); %局部拉伸,把[0.1 0.5]内的灰度拉伸为[0 1] subplot(2,2,3),imshow(J);title('线性变换图像[0.1 0.5]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系K=imadjust(I1,[0.3 0.7],[]); %局部拉伸,把[0.3 0.7]内的灰度拉伸为[0 1] subplot(2,2,4),imshow(K);title('线性变换图像[0.3 0.7]');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系3.非线性变换MATLAB程序实现如下:I=imread('xian.bmp');I1=rgb2gray(I);subplot(1,2,1),imshow(I1);title('灰度图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系J=double(I1);J=40*(log(J+1));H=uint8(J);subplot(1,2,2),imshow(H);title('对数变换图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系4.直方图均衡化MATLAB程序实现如下:I=imread('xian.bmp');I=rgb2gray(I);figure;subplot(2,2,1);imshow(I);subplot(2,2,2);imhist(I);I1=histeq(I);figure;subplot(2,2,1);imshow(I1);subplot(2,2,2);imhist(I1);5.线性平滑滤波器用MATLAB实现领域平均法抑制噪声程序:I=imread('xian.bmp');subplot(231)imshow(I)title('原始图像')I=rgb2gray(I);I1=imnoise(I,'salt & pepper',0.02);subplot(232)imshow(I1)title('添加椒盐噪声的图像')k1=filter2(fspecial('average',3),I1)/255; %进行3*3模板平滑滤波k2=filter2(fspecial('average',5),I1)/255; %进行5*5模板平滑滤波k3=filter2(fspecial('average',7),I1)/255; %进行7*7模板平滑滤波k4=filter2(fspecial('average',9),I1)/255; %进行9*9模板平滑滤波subplot(233),imshow(k1);title('3*3模板平滑滤波');subplot(234),imshow(k2);title('5*5模板平滑滤波');subplot(235),imshow(k3);title('7*7模板平滑滤波');subplot(236),imshow(k4);title('9*9模板平滑滤波');6.中值滤波器用MATLAB实现中值滤波程序如下:I=imread('xian.bmp');I=rgb2gray(I);J=imnoise(I,'salt&pepper',0.02);subplot(231),imshow(I);title('原图像');subplot(232),imshow(J);title('添加椒盐噪声图像');k1=medfilt2(J); %进行3*3模板中值滤波k2=medfilt2(J,[5,5]); %进行5*5模板中值滤波k3=medfilt2(J,[7,7]); %进行7*7模板中值滤波k4=medfilt2(J,[9,9]); %进行9*9模板中值滤波subplot(233),imshow(k1);title('3*3模板中值滤波'); subplot(234),imshow(k2);title('5*5模板中值滤波'); subplot(235),imshow(k3);title('7*7模板中值滤波'); subplot(236),imshow(k4);title('9*9模板中值滤波');7.用Sobel算子和拉普拉斯对图像锐化:I=imread('xian.bmp');subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,2,2),imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系H=fspecial('sobel'); %选择sobel算子J=filter2(H,I1); %卷积运算subplot(2,2,3),imshow(J);title('sobel算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系h=[0 1 0,1 -4 1,0 1 0]; %拉普拉斯算子J1=conv2(I1,h,'same'); %卷积运算subplot(2,2,4),imshow(J1);title('拉普拉斯算子锐化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系8.梯度算子检测边缘用MATLAB实现如下:I=imread('xian.bmp');subplot(2,3,1);imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(2,3,2);imshow(I1);title('二值图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=edge(I1,'roberts');figure;subplot(2,3,3);imshow(I2);title('roberts算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=edge(I1,'sobel');subplot(2,3,4);imshow(I3);title('sobel算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I4=edge(I1,'Prewitt');subplot(2,3,5);imshow(I4);title('Prewitt算子分割结果');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系9.LOG算子检测边缘用MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像');I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'log');subplot(2,2,3);imshow(I2);title('log算子分割结果');10.Canny算子检测边缘用MATLAB程序实现如下:I=imread('xian.bmp');subplot(2,2,1);imshow(I);title('原始图像')I1=rgb2gray(I);subplot(2,2,2);imshow(I1);title('灰度图像');I2=edge(I1,'canny');subplot(2,2,3);imshow(I2);title('canny算子分割结果');11.边界跟踪(bwtraceboundary函数)clcclear allI=imread('xian.bmp');figureimshow(I);title('原始图像');I1=rgb2gray(I); %将彩色图像转化灰度图像threshold=graythresh(I1); %计算将灰度图像转化为二值图像所需的门限BW=im2bw(I1, threshold); %将灰度图像转化为二值图像figureimshow(BW);title('二值图像');dim=size(BW);col=round(dim(2)/2)-90; %计算起始点列坐标row=find(BW(:,col),1); %计算起始点行坐标connectivity=8;num_points=180;contour=bwtraceboundary(BW,[row,col],'N',connectivity,num_points);%提取边界figureimshow(I1);hold on;plot(contour(:,2),contour(:,1), 'g','LineWidth' ,2);title('边界跟踪图像');12.Hough变换I= imread('xian.bmp');rotI=rgb2gray(I);subplot(2,2,1);imshow(rotI);title('灰度图像');axis([50,250,50,200]);grid on;axis on;BW=edge(rotI,'prewitt');subplot(2,2,2);imshow(BW);title('prewitt算子边缘检测后图像');axis([50,250,50,200]);grid on;axis on;[H,T,R]=hough(BW);subplot(2,2,3);imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); title('霍夫变换图');xlabel('\theta'),ylabel('\rho');axis on , axis normal, hold on;P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));x=T(P(:,2));y=R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7); subplot(2,2,4);,imshow(rotI);title('霍夫变换图像检测');axis([50,250,50,200]);grid on;axis on;hold on;max_len=0;for k=1:length(lines)xy=[lines(k).point1;lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');len=norm(lines(k).point1-lines(k).point2);if(len>max_len)max_len=len;xy_long=xy;endendplot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');13.直方图阈值法用MATLAB实现直方图阈值法:I=imread('xian.bmp');I1=rgb2gray(I);figure;subplot(2,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系[m,n]=size(I1); %测量图像尺寸参数GP=zeros(1,256); %预创建存放灰度出现概率的向量for k=0:255GP(k+1)=length(find(I1==k))/(m*n); %计算每级灰度出现的概率,将其存入GP中相应位置endsubplot(2,2,2),bar(0:255,GP,'g') %绘制直方图title('灰度直方图')xlabel('灰度值')ylabel('出现概率')I2=im2bw(I,150/255);subplot(2,2,3),imshow(I2);title('阈值150的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I3=im2bw(I,200/255); %subplot(2,2,4),imshow(I3);title('阈值200的分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系14. 自动阈值法:Otsu法用MATLAB实现Otsu算法:clcclear allI=imread('xian.bmp');subplot(1,2,1),imshow(I);title('原始图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系level=graythresh(I); %确定灰度阈值BW=im2bw(I,level);subplot(1,2,2),imshow(BW);title('Otsu法阈值分割图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系15.膨胀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imdilate(I1,se); %用生成的结构元素对图像进行膨胀subplot(1,2,2);imshow(I2);title('膨胀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系16.腐蚀操作MATLAB实现腐蚀操作I=imread('xian.bmp'); %载入图像I1=rgb2gray(I);subplot(1,2,1);imshow(I1);title('灰度图像')axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系se=strel('disk',1); %生成圆形结构元素I2=imerode(I1,se); %用生成的结构元素对图像进行腐蚀subplot(1,2,2);imshow(I2);title('腐蚀后图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系17.开启和闭合操作用MATLAB实现开启和闭合操作I=imread('xian.bmp'); %载入图像subplot(2,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(2,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1); %采用半径为1的圆作为结构元素I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(2,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(2,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系18.开启和闭合组合操作I=imread('xian.bmp'); %载入图像subplot(3,2,1),imshow(I);title('原始图像');axis([50,250,50,200]);axis on; %显示坐标系I1=rgb2gray(I);subplot(3,2,2),imshow(I1);title('灰度图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I2=imopen(I1,se); %开启操作I3=imclose(I1,se); %闭合操作subplot(3,2,3),imshow(I2);title('开启运算后图像');axis([50,250,50,200]);axis on; %显示坐标系subplot(3,2,4),imshow(I3);title('闭合运算后图像');axis([50,250,50,200]);axis on; %显示坐标系se=strel('disk',1);I4=imopen(I1,se);I5=imclose(I4,se);subplot(3,2,5),imshow(I5); %开—闭运算图像title('开—闭运算图像');axis([50,250,50,200]);axis on; %显示坐标系I6=imclose(I1,se);I7=imopen(I6,se);subplot(3,2,6),imshow(I7); %闭—开运算图像title('闭—开运算图像');axis([50,250,50,200]);axis on; %显示坐标系19.形态学边界提取利用MATLAB实现如下:I=imread('xian.bmp'); %载入图像subplot(1,3,1),imshow(I);title('原始图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I1=im2bw(I);subplot(1,3,2),imshow(I1);title('二值化图像');axis([50,250,50,200]);grid on; %显示网格线axis on; %显示坐标系I2=bwperim(I1); %获取区域的周长subplot(1,3,3),imshow(I2);title('边界周长的二值图像');axis([50,250,50,200]);grid on;axis on;20.形态学骨架提取利用MATLAB实现如下:I=imread('xian.bmp'); subplot(2,2,1),imshow(I); title('原始图像');axis([50,250,50,200]); axis on;I1=im2bw(I);subplot(2,2,2),imshow(I1); title('二值图像');axis([50,250,50,200]); axis on;I2=bwmorph(I1,'skel',1); subplot(2,2,3),imshow(I2); title('1次骨架提取');axis([50,250,50,200]); axis on;I3=bwmorph(I1,'skel',2); subplot(2,2,4),imshow(I3); title('2次骨架提取');axis([50,250,50,200]); axis on;21.直接提取四个顶点坐标I = imread('xian.bmp');I = I(:,:,1);BW=im2bw(I);figureimshow(~BW)[x,y]=getpts。
医学影像分割python代码
医学影像分割是医学图像处理领域的重要研究方向。
它主要利用计算机视觉和图像处理技术,对医学影像进行自动或半自动分割,以达到诊断、治疗和研究的目的。
随着深度学习技术的发展,基于深度学习的医学影像分割方法取得了很大的进展,已成为医学图像处理领域的热门研究方向。
Python作为一种功能强大的编程语言,在医学影像分割领域也得到了广泛的应用。
Python提供了丰富的科学计算库和图像处理库,如numpy, scipy, scikit-image等,这些库为医学影像分割提供了丰富的工具和方法。
本文将介绍基于Python的医学影像分割方法及相关代码实现。
1. 安装必要的Python库在进行医学影像分割之前,首先需要安装一些必要的Python库,包括但不限于numpy, scipy, scikit-image, SimpleITK等。
这些库提供了丰富的图像处理和医学影像分析工具,为医学影像分割提供了丰富的支持。
2. 加载医学影像数据在进行医学影像分割之前,首先需要加载医学影像数据。
Python提供了多种方式来加载医学影像数据,如使用SimpleITK库进行DICOM数据的读取、使用scikit-image库进行常规图像格式的读取等。
通过这些方法,可以方便地加载医学影像数据,并进行接下来的处理。
3. 数据预处理在进行医学影像分割之前,通常需要对医学影像数据进行预处理。
预处理包括但不限于图像去噪、图像增强、图像配准、图像分割等。
Python提供了丰富的图像处理方法和工具,如使用scikit-image进行图像增强、使用SimpleITK进行图像配准等。
通过这些方法,可以方便地对医学影像数据进行预处理。
4. 医学影像分割算法在进行医学影像分割之前,需要选择合适的医学影像分割算法。
Python提供了丰富的深度学习库和学习框架,如TensorFlow, Keras, PyTorch等。
这些库和框架提供了丰富的深度学习算法和方法,如U-Net, FCN, SegNet等。
数字图像处理实验完整代码(原创精心整理)
数字图像处理实验完整代码(原创精心整理)第一篇:数字图像处理实验完整代码(原创精心整理)实验一图象灰度变换(2学时)一、实验目的:理解数字图象处理的基本过程,掌握常用图象灰度变换算法,观察图像图象灰度变换的结果,加深对数字图象基本概念的理解。
二、实验内容:1、灰度线性变换变换函数为:s = a r + b设计程序,实现(a>1,b=0)、(00)和(a=1,b<0)等情况下的灰度变换处理,并比较处理前后的图象效果。
2、图象二值化设计程序,实现图象的二值化。
并给出三种门限下的处理结果。
3、负象变换设计程序,实现图象的反转操作(负象变换),并比较处理前后的图象结果。
4、灰度非线性变换(选做内容)设计程序,实现图象的指数变换和对数变换。
三、实验步骤:1、获取实验用图像:使用imread函数将图像读入Matlab,用size函数(或imfinfo函数)获取图象大小。
2、产生灰度变换函数:s = a r + b用imshow函数分别观察在(a>1,b=0)、(00)和(a=1,b<0)四情况下处理前后的结果。
适当选择参数,使处理结果达到较好的效果。
记录下所对应的参数。
3、用imwrite函数保存处理图象结果。
4、设计门限化方法实现图象的二值化的变换函数,并进行程序设计实现。
分别选择三个门限值,观察处理结果。
5、设计实现反转操作的变换函数,并进行程序设计实现。
观察处理结果。
6、分别设计实现图象的指数变换和对数变换的变换函数,参数自己选定,并比较处理前后的图象结果。
(选做内容)四、实验报告要求:画出算法的规范化程序设计流程图。
用plot等函数生成各类灰度变换函数曲线,用imshow函数显示处理前后图象。
在实验报告中提交原图像和各种变换函数的曲线,以及按各种变换函数处理后的图像,并进行实验结果分析。
选做内容可不写入报告中。
实验一代码R=imread('实验1原图.jpg');[m,n]=size(R)figure, imshow(R);title('原图1');S1=R*3;figure,imshow(S1);title('a=3,b=0');imwrite(S1,'1.21.jpg');N=im2double(R);S2=N*0.5;figure,imshow(S2);title('a=0.5,b=0');imwrite(S2,'1.22.jpg');S3=R+10;figure,imshow(S3);title('a=1,b=10');imwrite(S3,'1.23.jpg');S4=N+0.5;figure,imshow(S4);title('a=1,b=0.5');imwrite(S4,'1.24.jpg');X1=R>64;figure, imshow(X1);title('门限值为64');imwrite(X1,'1.41.jpg');X2=R>128;figure, imshow(X2);title('门限值为128');imwrite(X2,'1.42.jpg');X3=R>192;figure, imshow(X3);title('门限值为192');imwrite(X3,'1.43.jpg');Y=255-R;figure, imshow(Y);title('反转后的图像');imwrite(Y,'1.51.jpg');Z1=N.^0.6;figure, imshow(Z1);title('指数变换后的图像');imwrite(Z1,'1.61.jpg');Z2=log(N+1)%Z3=im2uint8(Z2)figure,imshow(Z3);figure,i mshow(Z2,[]);title('对数变换后的图像');imwrite(Z2,'1.62.jpg');实验二图象直方图及均衡(2学时)一、实验目的:理解图象灰度直方图的概念,掌握图象直方图的计算方法;掌握直方图均衡化图象增强技术,理解均衡化的处理过程。
实验三:数字图像分割处理的编程实现
实验三:数字图像分割处理的编程实现
一、实验课题: 数字图像分割处理的编程实现
二、实验内容:选用常用梯度算子、模板匹配、边缘检测的局部处理、Hough变换、基于图论的处理、区域生长、区域分离与合并、基于形态学分水岭的分割对给定的数字图像进行分割处理。
三、实验目标:
1.掌握常用梯度算子编程方法;
2.掌握边缘检测的局部处理原理;
3.掌握Hough变换实现直线的检测;
4.了解图论的处理、区域生长、区域分离与合并。
四、实验准备:
1.查阅相关资料
2.编程实现相应程序模块:
五、实验重点: 常用梯度算子、模板匹配、边缘检测的局部处理、Hough变换、数字图像进行分割处理的编程实现
六、实验难点: 常用梯度算子、模板匹配、边缘检测的局部处理、Hough变换、数字图像进行分割处理的编程实现
七、实验步骤:
1.启动Matlab,进行程序调试。
2.程序纠错
八、报告指导:
1、强调实验报告撰写的规范性:包括实验课题、实验内容、实验要求、
实验步骤、实验结果及分析和实验体会;
2、整个实验工程,源代码应上交,并独立实验调试,随机提出问题,以
便及时了解学生学习情况。
九、实验思考:
调试过程中,程序为何出错,并学出原因。
十、教学后记:
实验指导不要面面俱到、范范而谈,必须及时指出学生编程中出现的问题。
数字图像处理图像分割代码
实验六图像分割一、实验目的1、熟悉并掌握MATLAB图像处理工具箱的使用;2、理解并掌握常用的图像分割技术。
二、实验环境MATLAB 6.5以上版本、Windows XP或Windows 7计算机。
三、相关函数1edge检测灰度或者二值图像的边缘,返回一个二值图像,1像素是检测到的边缘,0像素是非边缘。
用法:BW = edge(I,'sobel',thresh,direction),I为检测对象;边缘检测算子可用sobel,roberts,prewitt,zerocross,log,canny;thresh指定阈值,检测时忽略所有小于阈值的边缘,默认自动选择阈值;direction方向,在所指定的方向direction上,用算子进行边缘检测horizontal(水平方向)、vertical(垂直方向)或both(两个方向)。
2strel创建形态学结构元素。
用法:SE = STREL('ball',R,H,N) 创建一个空间椭球状的结构元素,其X-Y平面半径为R,高度为H。
R必须为非负整数,H是一个实数。
N必须为一个非负偶数。
当N>0时此球形结构元素由一系列空间线段结构元素来近似。
SE = STREL('disk',R,N) 创建一个指定半径R的平面圆盘形的结构元素。
这里R必须是非负整数。
N须是0,4,6,8。
当N大于0时,圆盘形结构元素由一组N(或N+2)个周期线结构元素来近似。
当N等于0时,不使用近似,即结构元素的所有像素是由到中心像素距离小于等于R的像素组成。
N可以被忽略,此时缺省值是4。
注: 形态学操作在N>0情况下要快于N=0的情形。
4 imerode腐蚀图像用法:IM2 = imerode(IM,SE)腐蚀灰度、二进制或压缩二进制图像IM ,返回腐蚀图像IM2 。
参数SE 是函数strel 返回的一个结构元素体或是结构元素体阵列。
数字图像处理代码Ch7《图像分割》
来自《数字图像处理MATLAB版》书中示例,代码复制与运行结果。
例7.1 点检测。
代码:clc,clear,close all;f = imread('Fig1002(a).tif');imshow(f),title('(a)原始图像');w=[-1 -1 -1;-1 8 -1; -1 -1 -1 ]; %一个合适的点检测模板g=abs(imfilter(tofloat(f),w)); %abs操作不接受整数数据T=max(g(:));g=g>=T; %找到满足g>=T的所有点,赋值给g figure; imshow(g);title('(b)检测出的孤立点');运行结果:例7.2 检测指定方向的线。
代码:clc;clear,close all;f = imread('Fig1004(a).tif');subplot 231; imshow(f);title('(a)连线模板图像')w = [2 -1 -1;-1 2 -1; -1 -1 2]; %+45度线检测模板g = imfilter(tofloat(f),w);subplot 232 ,imshow(g,[]),title('(b)使用 +45度检测器处理后的图像') gtop = g(1:150,1:150); %左上角部分gtop = pixeldup(gtop,4); %enlarge by pixel duplication(就是维度*4) subplot 233; imshow(gtop,[])title('(c)+45度检测器处理后的图像左上角') gbot = g(end-119:end,end-119:end);gbot = pixeldup(gbot,4);subplot 234 ;imshow(gbot,[]),title('(d)-45度检测器处理后的图像右下角') g = abs(g);subplot 235; imshow(g,[]),title('(e)图(b)的绝对值')T = max(g(:)); g = g>=T;subplot 236 ;imshow(g),title('(f)满足条件[g>=T]的所有点(白色点)[其中g是图(e)]')运行结果:例7.3 使用Sobel边缘检测器。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图像边缘检测实验
一、实验目的及要求:
利用不同算子,对图像边缘进行检测。
二、实验内容:
(1)给定图像lena.bmp,用Sobel、Robert和Laplacian算子进行边缘检测。
(2)不能采用MATLAB中提供的边缘检测函数,要自己编程实现上面三个边缘检测算子。
把原始图像、用三种算子进行边缘检测后的图像同时显示出来,以供比较。
三、实验步骤:
1 .创建一个GUI用户界面窗口(如下图所示)
2 .编辑该GUI所对应的m文件,具体程序如下
(1)原始图像部分:
a=imread('lena.bmp');
subplot(2,2,1);
imshow(a);
title('原始图像');
(2)Sobel边缘检测图像部分:
b=imread('lena.bmp');
a=im2double(b);
实验运行结果:。