数字图像处理:实验六 图像分割

实验六 图像分割

数据分割是由图像处理到图像分析的关键步骤,是图像识别和计算机视觉至关重要的预处理,图像分割后提取的目标可用于图像识别、特征提取,图像搜索等领域。图像分割的基本策略主要是基于图像灰度值的两个特性,即灰度的不连续性和灰度的相似性,因此图像分割方法可分为基于边缘的分割方法和基于区域的分割方法。本次实验通过完成简单的图像分割进一步加深对图像分割的理解。

一、实验目的

进一步掌握MATLAB程序设计方法;
巩固图像分割理论与方法;
编程实现图像分割,比较基于阈值分割方法和基于边缘分割方法的效果,分析影响分割效果的因素。

二、实验基础

1.基于阈值的分割
基于阈值的分割属于区域分割的一种,是图像分割中最常用的一类方法,对于一个具有双峰分布的简单图像阈值分割方法,实际上是将输入图像f(i,j)通过变换得到输出图像g(i,j)的过程,即二值化过程。
阈值分割方法的关键是阈值T的确定,如果能确定一个合适的阈值,就可以准确地将图像分割开来,对于灰度直方图具有双峰分布的图像。可以选择古典处的灰度值作为阈值,在许多情况下物体和背景的对比度在图像中的各处是不同的,很难用一个统一的阈值将物体与背景分开。此时可以根据图像的局部特征分别采用不同的阈值进行分割。并分割的方法包括判断分析法,最佳熵自动阈值法,最小误差分割等。
阈值分割的优点是直观计算简单,运算效率较高,速度快。

2.基于边缘的分割
图像分割的另一种方式是通过边缘检测时限的边缘是指通过中像素灰度有阶跃或屋顶变化的像素级和边缘能勾画出物体轮廓,对图像识别和分析十分有用,是图像识别时提取的重要信息,由于边缘处的灰度是不连续的,因此可以利用边缘检测算子将边缘点检测出来,常用的边缘检测算子有梯度算子、Prewitt算子、Sobel算子、LOG算子和Canny算子等。
通过edge函数可以利用各种边缘检测算子检测图像边缘。

3.边缘跟踪
将检测的边缘点连接成线称为边缘跟踪,在识别图像中的目标时,往往需要对目标边缘做跟踪处理,即按一定顺序找出边缘点来绘制出编辑,如果图像是二值图像或图像中不同区域具有不同的像素值,但每个区域内的像素只是相同的,则可以完成基于四联通或八连通区域的轮廓跟踪。
利用bwtraceboundary函数可以在二值图像中追踪目标的轮廓线。

4.Hough变换检测
Hough变换是Paul Hough于1962年提出,是图像处理技术中用于识别几何形状的一种常用方法,它实现了一种从图像空间到参数空间的映射关系。Hough变换的基本原理是利用点线间的对偶性,将原始图像空间的给定曲线通过曲线表达形式变换成为参数空间的一个点。
MATLAB中常用的关于Hough变换的函数有:hough、houghpeaks和houghline。

三、实验仪器及设备

计算机、Matlab图像处理软件、待处理图像

四、实验内容及步骤

  1. 熟悉MATLAB中相关函数,掌握各函数的具体用法
(1)edge:边缘检测函数。
BW = edge(I)
采用灰度或一个二值化图像I作为它的输入,并返回一个与I相同大小的二值化图像BW,在函数检测到边缘的地方为1,其他地方为0。
BW = edge(I,'sobel') 自动选择阈值用Sobel算子进行边缘检测。
BW = edge(I,'sobel',thresh) 根据所指定的敏感度阈值thresh,用Sobel算子进行边缘检测,它忽略了所有小于阈值的边缘。当thresh为空时,自动选择阈值。
BW = edge(I,'sobel',thresh,direction) 根据所指定的敏感度阈值thresh,在所指定的方向direction上,用Sobel 算子进行边缘检测。Direction可取的字符串值为horizontal(水平方向)、vertical(垂直方向)或both(两个方向)。
[BW,thresh] = edge(I,'sobel',...) 返回阈值
(2)graythresh:利用Otsu算法(最大类间方差)获取全局阈值。
(3)im2bw:将灰度影像转换为二值图像。
(4)bwtraceboundary:在二值图像中追踪目标轮廓线。

help bwtraceboundary
bwtraceboundary Trace object in binary image.
B = bwtraceboundary(BW,P,FSTEP) traces the outline of an object in a binary image BW, in which nonzero pixels belong to an object and 0-pixels constitute the background. P is a two-element vector specifying the row and column coordinates of the initial point on the object boundary. FSTEP is a string or char vector specifying the initial search direction for the next object pixel connected to P. FSTEP can be any of the following strings or char vectors: ‘N’,‘NE’,‘E’,‘SE’,‘S’,‘SW’,‘W’,‘NW’, where N stands for north, NE stands for northeast, etc. B is a Q-by-2 matrix, where Q is the number of boundary pixels for the region. B holds the row and column coordinates of the boundary pixels.
B = bwtraceboundary(BW,P,FSTEP,CONN) specifies the connectivity to use when tracing the boundary. CONN may be either 8 or 4. The default value for CONN is 8. For CONN equal to 4, FSTEP is limited to ‘N’,‘E’,‘S’ and ‘W’.
B = bwtraceboundary(…,N,DIR) provides the option to specify the maximum number of boundary pixels, N, to extract and direction, DIR, in which to trace the boundary. DIR can be either ‘clockwise’ or ‘counterclockwise’. By default, or when N is set to Inf, the algorithmextracts all of the pixels from the boundary and, if DIR is not specified, it searches in the clockwise direction.

(5)hough:Hough变换函数。
1.hought函数
语法:[H, theta, rho] = hough(BW)
      [H, theta, rho] = hough(BW, ParameterName, ParameterValue)
描述:[H, theta, rho] = hough(BW)计算二值图像BW的标准hough变换。函数返回的H称为hough转换矩阵。theta和rho是一维数组,theta记录径,rho记录角度。BW可以是逻辑型,也可以是数值型。
(6)houghpeaks:Hough变换峰值识别。
peaks = houghpeaks(H, NumPeaks) 
peaks = houghpeaks(..., 'Threshold', val1, 'NHoodSize', val2) 
其中,"…"指出来自默认语法和peaks的输入是持有峰值行和列坐标的Q×2大小的矩阵。Q的范围是0到NumPeaks,H是霍夫变换矩阵。参数val1是非负的标量,指定了H中的什么值被考虑为峰值;val1可以从0到Inf变化,默认值是0.5*max(H(:))。参数val2是奇整数的两元素矢量,指定量围绕峰值的邻域大小。
(7)houghline:基于Hough变换提取线元。
lines = houghlines(f, theta, rho, peaks) 
lines = houghlines(..., 'FillGap', val1, 'MinLength', val2)
其中,theta和rho是来自函数hough的输出,peaks是函数houghpeaks的输出。输出lines是结构数组(可能检测到多条直线),长度等于找到的线段数。结构中的每个元素可以看成一条线,并含有下列字段:
point1:两元素向量[r1, c1],指定了线段起点的行列坐标。
point2:两元素向量[r2, c2],指定了线段终点的行列坐标。
theta:与线相关的霍夫变换的以度计量的角度。
rho:与线相关的霍夫变换的ρ轴位置。
其他参数如下:
val1是正的标量,指定了与相同的霍夫变换相关的两条线段的距离。当两条线段之间的距离小于指定的值时,函数houghlines把线段合并为一条线段(默认的距离是20个像素)。参数val2是正的标量,指定合并的线是保留还是丢弃。如果合并的线比val2指定的值短,就丢弃(默认值是40)。
  1. 简单图像的阈值分割
    (1)利用直方图进行阈值分割
    在这里插入图片描述
    在这里插入图片描述

图一 阈值分割
(2)利用最大类间方差自动确定阈值进行分割
在这里插入图片描述
在这里插入图片描述

图二 最大类间方差
3. 基于边缘的阈值分割
(1)利用各种边缘检测算子检测边缘
在这里插入图片描述
在这里插入图片描述

图三 边缘算子
思考:比较不同

Roberts算子检测方法对具有陡峭的低噪声的图像处理效果较好,但是利用roberts算子提取边缘的结果是边缘比较粗,因此边缘的定位不是很准确。

Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素。

Prewitt算子检测方法对灰度渐变和噪声较多的图像处理效果较好。但边缘较宽,而且间断点多。

Laplacian算子法对噪声比较敏感,所以很少用该算子检测边缘,而是用来判断边缘像素视为与图像的明区还是暗区。

Canny方法不容易受噪声干扰,能够检测到真正的弱边缘。优点在于,使用两种不同的阈值分别检测强边缘和弱边缘,并且当弱边缘和强边缘相连时,才将弱边缘包含在输出图像中。

(2)边缘跟踪(bwtraceboundary)函数
在这里插入图片描述
在这里插入图片描述

图四 边缘跟踪

思考:通过修改起始点的横纵坐标,可以改变找到的硬币边缘。
  1. Hough变换检测线段
clc;clear;
i=imread('circuit.tif');
i1=imrotate(i,30,'crop');%用crop方式显示,旋转后的图像跟原图像大小一样,多余的地方舍去
bw=edge(i1,'canny');
subplot(2,3,1);imshow(i);xlabel('原始图像');
subplot(2,3,2);imshow(i1);xlabel('旋转后的图像');
subplot(2,3,3);imshow(bw);xlabel('边缘检测图像');
[H,theta,rho] = hough(bw);%利用hough函数进行hough变换
subplot(2,3,4);hold on;imshow(imadjust(mat2gray(H)),[],'XData',theta,'YData',rho,'Initialmagnification','fit');
title('峰值检测');
xlabel('\theta(degrees)');ylabel('\rho');
axis on,axis normal,hold on
P=houghpeaks(H,10,'threshold',ceil(0.3*max(H(:))));
x=theta(P(:,2));
y=rho(P(:,1));
plot(x,y,'s','color','red');
lines=houghlines(bw,theta,rho,P,'FillGap',5,'MinLength',7);
subplot(2,3,5),imshow(i1);title('检测到的线段');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),'LineWidth',2,'color','yellow');
    plot(xy(2,1),xy(2,2),'LineWidth',2,'color','blue');
    %确定最长线段的端点
    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','red');

在这里插入图片描述

图五 hough变换

五、实验心得体会

  1. 图像分割是图像处理的重要步骤之一,在图像分割过程中算法是其主要的手法之一,但是每种算法有每种算法的特点,它的运行成果也行差万别。
  2. 实验中算法的编写总是出现各种各样的错误,经过细心的检查和耐心的改正错误基本都会改正错误。类型大致可分为:语法错误,函数调用,错误函数无法调用等类型。
  • 18
    点赞
  • 241
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 可以使用Matlab的Image Processing Toolbox中的kmeans函数进行图像聚类分割,具体步骤如下: 1. 读取图像 2. 将图像转换为灰度图像 3. 将灰度图像矩阵转换为向量 4. 调用kmeans函数,设置聚类数和迭代次数等参数 5. 将聚类结果矩阵重塑为图像矩阵 6. 显示聚类结果图像并进行调整和优化 使用kmeans聚类算法进行图像分割,可以对图像进行快速准确的分割,使得图像处理更加高效、精确、可靠。 ### 回答2: k-means clustering是数字图像处理中使用的一种常见算法,该算法能够对图像进行聚类、分割和分析。在matlab数字图像处理实验中,k-means clustering可以用来将彩色图像分割成若干个类别,每个类别代表着图像中的一种颜色或一种纹理。在这个过程中,k-means clustering会使用聚类中心来表示每个类别,聚类中心是类别的中心点,能够反映类别的特征。在分割结束后,我们可以将每个像素点所在的类别赋予它一个颜色,从而得到了一幅分割后的图像。 在对图像进行k-means clustering分割时,我们首先需要将图像转化为向量形式,即将图像中的每个像素都表示成一个向量,并将这些向量组成一个矩阵。然后,我们通过对向量之间的距离度量来计算聚类中心,即通过将向量分成k个类别并计算每个类别的中心点来确定聚类中心。接着,我们使用聚类中心来进行分割,将图像中的每个像素都与聚类中心进行比较并将其分配到最接近的类别中。分割结束后,我们还可以使用一些可视化的方法来显示分割后的图像,例如各个类别的中心点、每个像素所属的类别等。 k-means clustering 在图像分割中具有很大的优势,它不仅可以对图像进行颜色分割,还能够对图像中的其他特征进行分割,例如纹理、形状等。此外,该算法既简单又有效,能够在较短的时间内完成图像的分割和聚类。因此,在matlab数字图像处理实验中,k-means clustering是一种非常实用的算法,能够为我们分析和处理图像提供有力的支持。 ### 回答3: K-Means聚类算法是图像分割中常用的算法,该算法能够将图像分成数个不同的类别,从而实现对图像分割的目的。Matlab是一个强大的数字图像处理工具,也是一个非常好的实验平台,我们可以使用Matlab来实现K-Means聚类算法对图像进行分割。 首先需要准备一张需要分割的图像,并将图像转换为灰度图像。然后使用Matlab自带的函数imread()对图像进行读取,使用imresize()函数进行图像大小的调整。接下来,我们可以使用imhist()函数查看图像的灰度直方图,以便对图像的特征有更加全面的了解。 接下来,使用K-Means算法进行图像分割Matlab自带了一个kmeans()函数,该函数可以很方便的使用K-Means算法对图像进行分割。使用kmeans()函数需要给函数传递三个参数,分别是需要分割的图像、分割的类别数和最大迭代次数。分割的类别数和最大迭代次数需要进行多次实验调整选择,适合的类别数和最大迭代次数能够得到更好的图像分割效果。 最后,我们可以使用Matlab自带的imshow()函数查看图像分割的结果,为了方便比较,我们需要将图像分割前和分割后的图像进行比对。如果图像分割效果不理想,我们可以通过参数调整或改变算法来进行优化,比如可以使用其他聚类算法、改变聚类的特征参数或对图像进行其他处理等。 总之,K-Means聚类算法是图像分割中常用的算法之一,使用Matlab作为实验平台可以很方便的进行图像处理和算法实现。了解了算法流程后,我们可以通过多次实验对参数进行调整,以得到比较好的图像分割效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nochengzi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值