图像分割是将一幅数字图像分割成不同区域,在同一区域内具有在一定的准测下可认为是相同的性质,如灰度、颜色、纹理等,而任何相邻区域之间其性质具有明显的区别,主要包括边缘分割技术、阈值分割技术和区域分割技术

边缘分割技术

利用物体和背景在某种图像特性上的差异来实现的。

图像中的线段

将图像点x(x,y)某个领域中的每个像素值都与模板中对应的系数相乘,然后将结果进行累加,从而得到该点的新像素值。如果邻域的大小为m×n,则总共有mn个系数。这些系数组成矩阵,称为模板或算子。
对于图像中的间断点,常用的检测模板为:

对于图像中的线段,常用的检测模板为:分别对应水平线段、+45°线段、垂直线段和-45°线段

检测图像中的线段

>> I = imread('E:\persional\matlab\images\house.tif');
>> h1 = [-1,-1,-1;2,2,2;-1,-1,-1];%模板
>> h2 = [-1,-1,2;-1,2,-1;2,-1,-1];
>> h3 = [-1,2,-1;-1,2,-1;-1,2,-1];
>> h4 = [2,-1,-1;-1,2,-1;-1,-1,2];
>> J1 = imfilter(I,h1);%线段检测
>> J2 = imfilter(I,h2);
>> J3 = imfilter(I,h3);
>> J4 = imfilter(I,h4);
>> J = J1+J2+J3+J4;%线条叠加
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);%显示检测到的线段

微分算子

通过算子对图像进行滤波,可以得到图像的边缘

Roberts算子:对于离散的图像f(x,y),边缘检测算子就是用图像的垂直和水平差分来逼近梯度算子,即为:
▽f = (f(x,y)-f(x-1,y),f(x,y)-f(x,y-1))
在进行边缘检测时,对图像中的每个像素计算▽f,然后求绝对值,最后进行阈值操作就可以实现。
Roberts算子计算公式:

Roberts算子由下面的两个模板组成:

采用函数edge()进行图像的边缘检测,该函数的返回值为二值图像,和输入图像大小相同,数据类型为逻辑型

BW = edge(I,‘roberts’)
BW = edge(I,‘roberts’,thresh)
[BW,thresh] = edge(I,‘roberts’,…)

BW:二值图像
thresh:分割阈值

图像边缘检测:

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> [J,thresh] = edge(I,'roberts',15/255);
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

Prewitt算子:更加复杂的图像大小为3×3的算子

BW = edge(I,‘Prewitt’)
BW = edge(I,‘Prewitt’,thresh)
BW = edge(I,'Prewitt,thresh,direction)
[BW,thresh] = edge(I,‘Prewitt’,…)

BW:二值图像
thresh:分割阈值,可以为空矩阵[ ],如若不设置,系统自动计算阈值进行分割
direction:可以取值horizontal、vertical和borth,默认为borth

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> [J,thresh] = edge(I,'Prewitt',[],'both');%采用prewitt算子边缘检测
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

Sobel算子:

BW = edge(I,‘Sobel’)
BW = edge(I,‘Sobel’,thresh)
BW = edge(I,‘Sobel’,thresh,direction)
[BW,thresh] = edge(I,‘Sobel’,…)

BW:二值图像
thresh:分割阈值,可以为空矩阵[ ],如若不设置,系统自动计算阈值进行分割
direction:可以取值horizontal、vertical和borth,默认为borth

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> [J,thresh] = edge(I,'sobel',[],'horizontal');%采用sobel算子检测边缘
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

采用函数fspecial()产生预定义模板:

>> format rat;%设置为有理输出
>> hsobel = fspecial('sobel');%获得水平方向的算子,可以通过转置得到垂直方向的算子
>> hprewitt = fspecial('prewit');%获得水平方向的算子,可以通过转置得到垂直方向的算子
>> hlaplacian = fspecial('laplacian');
>> hlog = fspecial('log',3);
>> format short;%设置输出数据的格式
>> hsobelhsobel =1     2     10     0     0-1    -2    -1>> hprewitthprewitt =1     1     10     0     0-1    -1    -1>> hlaplacianhlaplacian =0.1667    0.6667    0.16670.6667   -3.3333    0.66670.1667    0.6667    0.1667>> hloghlog =0.4038    0.8021    0.40380.8021   -4.8233    0.80210.4038    0.8021    0.4038

采用函数fespecail()和imfilter提取图像的边缘:

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> h = fspecial('laplacian');
>> J = imfilter(I,h,'replicate');%图像滤波
>> K = im2bw(J,20/255);%变为二值图
>> figure,
>> subplot(131),imshow(I);
>> subplot(132),imshow(J);%显示灰度
>> subplot(133),imshow(K);%二值图像

Canny算子

优点:低误码率、高定位精度和抑制虚假边缘等优点

BW = edge(I,‘canny’)
BW = edge(I,‘canny’,thresh)
BW = edge(I,‘canny’,thresh,sigma)
[BW,thresh] = edge(I,‘canny’,…)

BW:二值图像
thresh:分割阈值,可以为空矩阵[ ],如若不设置,系统自动计算阈值进行分割
sigma:对高斯滤波器的标准值sigma进行设置,默认值为1

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> J = imnoise(I,'gaussian',0,0.01);%添加高斯噪声
>> [K,thresh]=edge(J,'canny');%Canny算子检测边缘
>> figure,
>> subplot(121),imshow(J);
>> subplot(122),imshow(K);

LOG 算子

拉普拉斯算子是一种不依赖边缘方向的二阶微分算子,它是标量而不是矢量,而且具有旋转不变的性质,在图像处理中经常被用来提取图像的边缘,表达式:

数字图像的近似公式:▽2 f(x,y) = f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1) - 4*f(x,y)
由于Laplacian算子是二阶微分算子,对图像中的噪声非常敏感,首先采用Gaussian函数对图像进行平滑,然后采用Laplacian算子根据二阶导数过零点来检测图像边缘,称为LOG

BW = edge(I,‘log’)
BW = edge(I,‘log’,thresh)
BW = edge(I,‘log’,thresh,sigma)
[BW,thresh] = edge(I,‘log’,…)

BW:二值图像
thresh:分割阈值,可以为空矩阵[ ],如若不设置,系统自动计算阈值进行分割
sigma:对高斯滤波器的标准值sigma进行设置,默认值为2,滤波器大小为n×n,其中n为ceil(sigma×3)×2+1

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> J = imnoise(I,'gaussian',0,0.05);
>> [K,thresh] = edge(J,'log',[],6);
>> figure,
>> subplot(131),imshow(I);
>> subplot(132),imshow(J);
>> subplot(133),imshow(K);

阈值分割技术

阈值分割技术是最简单的一种图像分割方法,关键在于寻找合适的阈值,通常根据图像的直方图来选取

全局阈值

通过全局的信息,例如整个图像的灰度直方图。如果在整个图像中只使用一个阈值,则这种方法叫做全局阈值法,整个图像分成两个区域,即目标对象(黑色)和背景对象(白色)。全局阈值将整个图像的灰度阈值设置为常熟。
对于物体和背景对比较明显的图像,其灰度直方图为双峰形状,可以选择两峰之间的波谷对应的像素值作为全局阈值,将图像分割为目标对象和背景。公式如下:

其中f(x,y)为点(x,y)的像素值,g(x,y)为分割后的图像,T为全局阈值,通常通过直方图来获取全局阈值。

采用全局阈值对图像进行分割:

>> I = imread('E:\persional\matlab\images\house.tif');
>> [width,height] = size(I);
>> imhist(I,200);
>> J = I>124;%图像分割,阈值为124
>> for i=1:widthfor j=1:heightif(I(i,j)>164)%图像分割,阈值为164K(i,j)=1;elseK(i,j)=0;endendend
>> figure,
>> subplot(121),imshow(J);
>> subplot(122),imshow(K);


![在这里插入图片描述](https://img-blog.csdnimg.cn/71b9dcb425124071afc9713ca9d77278.png#pic_center

对于彩色图像来说,首先将其转换成灰度图像,然后再转换为二值图像

BW = im2bw(I,level)
BW = im2bw(X,map,level)
BW = im2bw(RGB,level)
level:阈值

>> I = imread('E:\persional\matlab\images\ln.tif');
>> [I1,map] = rgb2ind(I,64);%变成索引图像
>> J = ind2gray(I1,map);%索引图像转换成灰度图像
>> K = im2bw(I1,map,0.4);图像分割
>> figure,
>> subplot(131),imshow(I1);
>> subplot(132),imshow(J);
>> subplot(133),imshow(K);

Otsu阈值分割

最大方差法,该算法是在灰度直方图的基础上采用最小二乘法原理推导出来的,基本原理是以最佳的阈值将图像的灰度值分割成为两部分,使两部分之间的方差最大,即具有最大的分离性
设f(x,y)为大小为M×N图像f上(x,y)处的灰度值,灰度等级为L,则f(x,y)∈[0,L-1]。若灰度级i的所有像素个数为fi,则第i级灰度出现的概率为:p(i) = fi/(M×N)
将图像中的像素按灰度级用阈值t划分为两类。即背景C0和目标C1.背景C0的灰度级为0-t-1,目标C1的灰度级为t-L-1。背景C0和目标C1对应的像素分别为:{f(x,y)<t}和{f(x,y)>=t}


k的范围为0~L-1,计算不同k值下的类间方差,使得类间方差最大,k即为最优的阈值

level = graythresh(I)
level:最优的阈值

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> T = graythresh(I);
>> J = im2bw(I,T);
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

迭代式阈值分割

迭代阈值分割的步骤如下:
1、设定参数T0,并选择一个初始的估计阈值T1
2、用阈值T1分割图像。将图像分成两部分:G1是灰度值大于T1的像素组成,G2是小于或等于T1的像素组成
3、计算G1和G2中所有像素的平均灰度值μ1和μ2,以及新的阈值T2 = (μ1+μ2)/2
4、如果|T2-T1|<T0,则T2为最优阈值,否则T2赋值给T1,并重复步骤2~4,直到最优

>> I = imread('E:\persional\matlab\images\house.tif');
>> I = im2double(I);
>> T0 = 0.01;
>> T1 = (min(I(:))+max(I(:)))/2;
>> r1 = find(I>T1);
>> r2 = find(I<=T1);
>> T2 = (mean(I(r1))+mean(I(r2)))/2;
>> while abs(T2-T1)<T0T1 = T2;r1 = find(I>T1);r2 = find(I<=T1);T2 = (mean(I(r1))+mean(I(r2)))/2;end
>> J = im2bw(I,T2);
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

区域分割技术

区域生长法

区域生长的基本思想是将具有相似性质的像素集合起来构成区域,其可以包括平均灰度值、纹理和颜色等信息。

分水岭分割

把图像看成一幅地形图,灰度值对应地形的高度值,高灰度值对应山峰,低灰度值对应山谷。水总是朝低势流动,知道低洼处,所有的水都会处于不同的盆地,盆地之间的山脊称为分水岭,分水岭分割相当于是一个自适应的多阈值分割算法

L = watershed(I)
L = watershed(I,conn)
L:标记矩阵,分水岭为0,第几个水盆就是几
conn:连通区域

>> I = imread('E:\persional\matlab\images\ba.tif');
>> J = watershed(I,8);
>> figure,
>> subplot(121),imshow(I);
>> subplot(122),imshow(J);

图像分割(matlab)相关推荐

  1. matlab 图像分割库,图像分割Matlab代码

    图像分割Matlab代码 图像分割 Matlab 代码(一)图像边缘检测不同方法比较将 Roberts.Sobel.Prewitt.LOG.Canny 算子等经典图像分割算法对灰度图像分割的结果进行比 ...

  2. 图像分割matlab阈值自动计算,图像分割的阈值算法matlab实现.doc

    图像分割的阈值算法matlab实现.doc 图像分割的阈值算法matlab实现[OTSU,1DEntropy,2DEntropy]今天看了几篇论文,实现了一下,没有验证各算法的有效性也没有进行定量比较 ...

  3. 【图像分割】基于 C-V模型水平集图像分割Matlab代码

    1 简介 图像分割是计算机视觉中的关键步骤之一.传统的分割方法由于方法自身的局部性,难以满足复杂分割的要求,基于水平集方法的图像分割研究正是这种需求下出现的.C-V模型对灰度图像的变化处理非常自然,解 ...

  4. 基于matlab的彩色图像分割,彩色图像分割MATLAB

    [实例简介] 基于HSV彩色空间的图像分割,包含测试图片,MATLAB源程序,可以参考一下 [实例截图] [核心代码] 彩色图像分割 └── 基于matlab的彩色图像的分割算法 └── 公园与青椒的 ...

  5. 医学图像分割 matlab,MATLAB在医学图像分割处理中的应用

    ValueEngineering 0 引言 医学图像分割是将图像分割技术应用于医学领域的成功示例,它是医学图像处理的重要手段,在很大程度上提高了医生的确诊率.基于不同设备和运行原理的医学图像比较复杂, ...

  6. 彩色图像分割MATLAB代码

    彩色图像分割模型用的是RGB模型,对三通道分别处理 clear all clc; I=imread('football.jpg'); [M N t]=size(I); I1=I; I2=I; for ...

  7. fcm脑图像分割matlab,MATLAB程序:用FCM分割脑图像

    MATLAB程序:用FCM分割脑图像 1. MATLAB程序 FCM_image_main.m function [accuracy,iter_FCM,run_time]=FCM_image_main ...

  8. 【图像分割】基于模糊核聚类算法KFCM实现医学图像分割matlab代码

    1 简介 医学影像分割的基本目标是将图像分割成不同的解剖组织,从而可以从背景中提取出感兴趣区域.因为图像的低分辨率和弱对比度,实现医学影像分割是一件具有挑战的任务.而且,这个任务由于噪声和伪阴影变得更 ...

  9. 【图像分割】基于FCM+KFCM MRI图像分割matlab源码含GUI

    一.简介 1 如何理解模糊聚类\ 事物间的界线,有些是明确的,有些则是模糊的.当聚类涉及到事物之间的模糊界线时,需要运用模糊聚类分析方法.\ 如何理解模糊聚类的"模糊"呢:假设有两 ...

最新文章

  1. 聚簇索引与非聚簇索引学习总结
  2. 2022年全球及中国盐酸异丙肾上腺素行业投资风险与运营盈利分析报告
  3. 为您的软件系统设计选择最佳的工具
  4. mongo数据库 备份 还原
  5. 天气预报为什么要用超级计算机,为什么天气预报不够准确?
  6. BSTR与CString之前的转换
  7. 从TensorFlow到PyTorch:九大深度学习框架哪款最适合你?
  8. python怎么画简单图-Python | 用matplotlib画些简单的图
  9. Linux内核模块静态加载的顺序
  10. java 读取 properties 配置文件的几种方式
  11. excel打不开html超链接,excel超链接打不开怎么回事 excel超链接的详细制作教程
  12. Mac系统中移动硬盘热拔(强制退出)后,在插上不显示移动硬盘的问题和解决办法
  13. python中的相对导入//__name__和__package__的作用//以及相对导入的两个经典错误
  14. 碧蓝航线内部表情包(有爱自取)
  15. 火狐浏览器This address is restricted.端口问题
  16. 绝了,SpringBoot引入 Dataway,无需开发任何代码配置一个满足需求的接口!
  17. linux zsh 终端,linux安装zsh终端
  18. 开发STM32相关资料下载
  19. 计算机科学四个名校,计算机科学CS四大名校来啦
  20. 【opencv450-samples】delaunay 三角剖分和 voronoi 细分

热门文章

  1. 网络新系统客户端常见问题及解决方案
  2. 下拉框系统甄选火星推荐_微博下拉框技术首荐15火星牛
  3. c语言词法分析器实验原理,词法分析器的设计与实现 编译原理实验报告.doc
  4. 软件开发大牛们需要遵守的10大原则
  5. Scratch音效素材试听后缀名问题
  6. confluence 编辑器这次没有加载_推荐一款编辑器然后是R语言的相关性分析
  7. rdworksv8教学说明书_RDWorksv8软件下载
  8. 1.[C# Winform]BackgroundWorker实现进度条的那点事儿
  9. 【设计模式】模板模式实现报表模板
  10. android studio安装GRADLE下载慢的问题