matlab中图像处理库

2017-04-10 18:18:49 dingkeyanlail 阅读数 7247

整理电脑时,发现了本科时做的一个matlab GUI,关于图像处理的一些基本操作,里面有挺多功能的,看下面的图片。

图像类型转化,几何运算,图像变换,添加噪声,图像复原,图像增强,图像分割,形态学处理,小波变换,和几个应用。内部源程序主要来源于——Matlab数字图像处理(张德丰第二版)。我把源文件传上来了,欢迎下载试用,有一些Bug,见谅,毕竟本科时候做的。

链接地址:http://download.csdn.net/detail/dingkeyanlail/9809796

2018-07-20 17:34:02 appleaoliao 阅读数 792

1、头文件添加 #include <engine.h>

2、包含目录添加以下两个文件

3、库目录添加以下文件

4、链接器中输入一下lib

5、以下程序启动matlab

    Engine* ep = engOpen(NULL);

6、之后便可以使用matlab了,使用格式如下:

engEvalString(ep, "。。。。。。。。。。。");  双引号里面写命令

7、以下程序关闭matlab引擎

engClose(ep);

 

注意:如果碰到缺少libeng.lib , 就检查系统环境变量有没有把下面的环境变量写在系统的path里面

2017-04-13 13:39:13 gloriazhang2013 阅读数 632

一、图像读取和显示

1、图像的读取

filename图像文件的完整路径和文件名,如果在当前工作目录下,只需提供文件名,fmt是图像文件的格式对应的扩展名

A=imread(filename,fmt)

2、图像的写入

imwrite(A,filename,fmt)

3、图像的显示

I为要显示的图像矩阵,[low high]指定显示灰度图像的灰度范围,高于high的像素被显示成白色,低于low的显示成黑色,

imshow(I,[low high])

创建一个新窗口

figure;

打开一个m行n列图像位置的窗口,并将焦点定于第p个位置上

subplot(m,n,p)

4、图像的格式转换

阈值法从RGB、灰度图创建二值图,LEVEL为指定的阈值(0,1),rgb2gray,存储类型不变,im2uint8转换成uint8类型,im2double将图像转换成double

im2bw(I,LEVEL);

二、图像的点运算

 1、图像直方图

 灰度直方图描述了灰度级的统计信息,主要用于图像分割和图像灰度变化。归一化直方图不同灰度级出现的 比率,横坐标像素点的灰度级别,纵坐标各个灰度级别的像素在图像中出现的次数和概率。

imhist(I);灰度直方图

2、灰度的线性变换

DB=f(DA)=fADA+fB

fA>0输出图像的对比度增大,fB<0输出图像的对比度减小,fA=1且fB非零时,所有像素的灰度值上移或下移,整个图像更暗或更亮,fA<0,暗区变亮,亮区变暗

3、灰度的对数变换

t=clog(k+s)

c为尺度比例常数,s为源灰度值,t为变换后的目标灰度值。k为常数。灰度的对数变换可以增强一副图像中较暗部分的细节,可以用来扩展被压缩的高值图像中较暗像素。广泛应用于频谱图像的显示。warning: 先进行im2double

4、灰度的Gamma变换

 y=(x+esp)^r

x、y的取值范围为【0,1】。esp为补偿系数,r为Gamma系数,

imshow(imadjust(I,[],[],0.5));%gamma=0.5

4、灰度阈值变换及二值化

 thresh=graythresh(I);%自动设定所需的最优化阈值。

 OTSU算法:最大类间方差法自动单阈值分割

Kapur算法:一维直方图熵阈值算法

niblack算法:局部阈值分割

阈值的计算公式是T=m+k*v,其中m为该像素点为中心的区域的平均灰度值,v是该区域的标准差k是一个系数。

KittlerMet:表示kittler最小分类错误全局二值化算法。

5、直方图均衡化

[J,T]=histeq(I);%J为输出图像,T为变换矩阵。

影响图像识别和分类也称图像灰度归一化。

三、图像的几何变换

1、图像平移

正变换

逆变换

strel%用来创建形态学结构元素

translate(SE,[y x])%原结构元素SE上y和x方向平移

imdilate%形态学膨胀。

2、图像镜像

 B=imtransform(A,TFORM,method);

TFORM=makeform(transformtype,Matrix);%空间变换结构

method:bicubic 双三次插值

               bilinear双线性插值

              nearest最近邻插值

transformtype指定了变换的类型,常见的affine为二维或三维仿射变换,包含平移、旋转、比例、拉伸和错切等

四、空间域图像增强

1、噪声添加

 h=imnoise(I,type,parameters);

gaussian:高斯白噪声,幅度为高斯分布,功率谱均匀分布

salt&pepper :黑点如胡椒,白点如盐粒。图像传感器、传输信道、解码处理、图像切割等产生的黑白相间的亮黑点噪声。

2、空间域滤波

 滤波过程就是在图像中f(x,y)中逐点移动模板,使模板中心和点(x,y)重合,滤波器在每一点(x,y)的响应是根据模板的具体内容并通过预先定义的关系来计算的。

B=imfilter(f,w,option1,option2,...);

3、滤波器设计

   h=fspecial(type,parameters)

  parameters为可选项,是和所选定的滤波器类型type相关的配置参数,如尺寸和标准差。

type为滤波器的类型。

    ‘average’ 平均模板

    ‘disk’ 圆形领域的平均模板

    ‘gaussian’ 高斯模板

     ‘laplacian’拉普拉斯模板

     ‘log’高斯-拉普拉斯模板

    ‘prewitt’ prewitt水平边缘检测算子

   ‘sobel’sobel水平边缘检测算子

4、中值滤波

     中值滤波本质上是一种统计排序滤波器。中值不同于均值,是指排序队列中位于中间位置的元素的值

中值滤波并非线性滤波器。主要应用消除椒盐噪声。

  h=medfilt2(l1,[m,n]);

m和n为中值滤波处理的模板大小,默认3*3

5、图像锐化

   主要用于增强图像的灰度跳变部分,通过运算导数(梯度)或有限差分来实现。

五、频率域图像增强

 用傅里叶变换表示的函数特征可以完全通过傅里叶反变换进行重建而不丢失任何信息

  吉布斯现象(Gibbs phenomenon):

六、彩色图像处理

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2015-04-08 21:49:29 zy122121cs 阅读数 8216

转自:http://cvnote.info/matlab-cv-ip-toolbox/


计算机视觉/图像处理研究中经常要用到Matlab,虽然其自带了图像处理和计算机视觉的许多功能,但是术业有专攻,在进行深入的视觉算法研究的时候Matlab的自带功能难免会不够用。本文收集了一些比较优秀的Matlab计算机视觉工具箱,希望能对国内的研究者有所帮助。

VLFeat:著名而常用

项目网站:http://www.vlfeat.org

许可证:BSD

著名的计算机视觉/图像处理开源项目,知名度应该不必OpenCV低太多,曾获ACM Open Source Software Competition 2010一等奖。使用C语言编写,提供C语言和Matlab两种接口。实现了大量计算机视觉算法,包括:

  • 常用图像处理功能,包括颜色空间变换、几何变换(作为Matlab的补充),常用机器学习算法,包括GMM、SVM、KMeans等,常用的图像处理的plot工具。
  • 特征提取,包括 Covariant detectorsHOGSIFT,MSER等。VLFeat提供了一个vl_covdet() 函数作为框架,可以方便的统一所谓“co-variant feature detectors”,包括了DoG, Harris-Affine, Harris-Laplace并且可以提取SIFT或raw patches描述子。
  • 超像素(Superpixel)分割,包括常用的Quick shiftSLIC算法等
  • 高级聚类算法,比如整数KMeans:Integer k-means (IKM)、hierarchical version of integer k-means (HIKM),基于互信息自动判定聚类类数的算法Agglomerative Information Bottleneck (AIB) algorithm等
  • 高维特曾匹配算法,随机KD树Randomized kd-trees

可以在这里查看VLFeat完整的功能列表。

(欢迎访问计算机视觉研究笔记http://cvnote.info或者关注新浪@cvnote

MexOpenCV:让Matlab支持调用的OpenCV

项目网站:http://www.cs.sunysb.edu/~kyamagu/mexopencv/

作者Kota Yamaguchi桑是石溪大学(Stony Brook University)的PhD,早些时候自己搞了一套东西把OpenCV的代码编译成Matlab可用的mex接口,然后这个东西迅速火了。今年夏天这个项目被OpenCV吸收为一个模块,貌似是搞了一个Google Summer of Code(GSoC)的项目,最近(大概是9、10月)已经merge到了OpenCV主包,有兴趣的可以到Github的OpenCV库下的module/matlab去玩一下,应该会在10月份的OpenCV 3 alpha里正式发布。现在OpenCV就同时有了Python和Maltab的binding(好强大)。具体的功能就不细说了,既然是OpenCV的binding,当然是可以使用OpenCV的绝大多数算法了。比如这样:

facedetect

Peter Kovesi的工具箱:轻量好用,侧重图像处理

项目网站:http://www.csse.uwa.edu.au/~pk/research/matlabfns/

这位Peter大哥目前在The University of Western Australia工作,他自己写了一套Matlab计算机视觉算法,所谓工具箱其实就是许多m文件的集合,全部Matlab实现,无需编译安装,支持Octave(如果没有Matlab的话,有了这个工具箱也可以在Octave下进行图像处理了)。别看这位大哥单枪匹马,人家的工具箱可是相当有名,研究时候需要哪个Matlab的计算机视觉小功能,直接到他家主页上下几个m文件放在自己文件夹就好了。这个工具箱主要以图像处理算法为主,附带一些三维视觉的基本算法,列一些包括的功能:

可以在网站上看到全部功能的介绍和下载,非常推荐试一下,也可以学到不少算法。

Machine Vision Toolbox:侧重机器视觉、三维视觉

项目网站:http://www.petercorke.com/Machine_Vision_Toolbox.html

许可证:LGPL

以前没有用过这个工具箱,最近发现竟然非常强大,而且和我自己的工作还很相关。这个工具箱侧重机器视觉,作者是另一个Peter,Peter Corke在机器人界很有名,他在2011年写了一本书《Robotics, Vision & Control》介绍了机器视觉相关的颜色、相机模型、三维视觉、控制等研究,并配套这个工具箱。算法包括了大量常用的视觉和图像处理小函数,,这些就不提了,提几个别的工具箱一般没有的功能

  • Bag of words的Matlab实现
  • 各种相机模型的实现,包括普通相机、鱼眼相机、Catadioptric相机模型等等。如果你做机器人视觉、挂在各种广角相机的话,这些模型实现会很有用
  • 自带简单的相机标定功能
  • 对极几何(Epipolar Geomtry)的相关算法函数
  • Plucker坐标的实现,做广义相机模型(Generalized camera model)很有用

Piotr's Image & Video Matlab Toolbox:侧重物体识别

项目网站:http://vision.ucsd.edu/~pdollar/toolbox/doc/index.html

许可证:Simple BSD

(补充一个工具箱)由UCSD的Piotr Dollar编写,侧重物体识别(Object Recognition)检测相关的特征提取和分类算法。这个工具箱属于专而精的类型,主要就是Dollar的几篇物体检测的论文的相关算法,如果做物体识别相关的研究,应该是很好用的。同时它的图像操作或矩阵操作函数也可以作为Matlab图像处理工具箱的补充,功能主要包括几个模块:

  • channels模块,图像特征提取,包括HOG等,Dollar的研究工作提出了一种Channel Feature的特征1,因此这个channels主要包括了提取这一特征需要的一些基本算法梯度、卷及等基本算法
  • classify模块,一些快速的分类相关算法,包括random ferns, RBF functions, PCA等
  • detector模块,与Channel Feature特征对应的检测算法1
  • filters模块,一些常规的图像滤波器
  • images模块,一些常规的图像、视频操作,有一些很实用的函数
  • matlab模块,一些常规的Matlab函数,包括矩阵计算、显示、变量操作等,很实用
  • videos模块,一些常规的视频操作函数等

1. P. Dollár, Z. Tu, P. Perona and S. Belongie, "Integral Channel Features", BMVC 2009.

DIPUM Toolbox:经典教材配套

项目地址:http://www.imageprocessingplace.com/DIPUM_Toolbox_2/DIPUM_Toolbox_2.htm

冈萨雷斯著名的图像处理教材《数字图像处理》的配套工具包,主要是书中图像处理算法的实现,名气自然是不必说了,网上可以免费下到加密后的p文件放在Matlab下面用,作为图像处理入门的上手玩具。

MATLAB Functions for Multiple View Geometry:又一个经典教材配套

项目网站:http://www.robots.ox.ac.uk/~vgg/hzbook/code/

许可证:MIT

又是一本大名鼎鼎的教材《计算机视觉中的多图几何》(Multiple View Geometry in Computer Vision),值得所有做三维视觉的研究者好好研究的书,国内很早就翻译了中文版。作者Zisserman提供了部分书中算法的Matlab实现,是深入理解书中理论的非常好的辅助材料。

其他的工具箱

  • DIPImage & DIPLib,提供Matlab和C接口的图像处理功能,比较早,现在估计很少有人用或者知道了吧?
  • Matlab CVPR toolbox,计算机视觉和模式识别相关的Matlab功能,好像没什么人用。
  • 相关领域的工具箱,比如做机器学习的、做Markov随机场的等等,以后有机会写一下。
  • 特定功能的工具箱,比如相机标定工具箱,这个可推荐的还阵挺多,以后有机会写一下。
  • 这个链接里可以找到一些Matlab的开源工具箱。
2018-07-04 09:14:49 qq_38096703 阅读数 2085

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函数)
clc
clear all
I=imread('xian.bmp');
figure
imshow(I);
title('原始图像');
I1=rgb2gray(I);                %将彩色图像转化灰度图像 
threshold=graythresh(I1);        %计算将灰度图像转化为二值图像所需的门限
BW=im2bw(I1, threshold);       %将灰度图像转化为二值图像
figure
imshow(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); 
%提取边界
figure
imshow(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;
end
end
plot(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:255
     GP(k+1)=length(find(I1==k))/(m*n);    %计算每级灰度出现的概率,将其存入GP中相应位置
end
subplot(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算法:
clc
clear all
I=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); 
figure
imshow(~BW)

[x,y]=getpts


转自:https://blog.csdn.net/u012116229/article/details/44775277