锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-09-22 12:07:02 bw氯气传感器

实验六 图像分割

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

一、实验目的

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

二、实验基础

1.基于阈值的分割 基于阈值的分割属于区域分割,是图像分割中最常用的方法。对于具有双峰分布的简单图像阈值分割方法,实际上是输入图像f(i,j)输出图像通过转换获得g(i,j)二值化过程。 阈值分割方法的关键是确定阈值T。如果可以确定合适的阈值,图像可以准确分割,灰度直方图像有双峰分布图像。可以选择古典场所的灰度值作为阈值。在许多情况下,图像中物体和背景的对比度是不同的,很难将物体与背景分开。此时可根据图像的局部特征分别采用不同的阈值进行分割。分割方法包括判断分析法、最佳熵自动阈值法、最小误差分割等。 阈值分割的优点是直观计算简单,操作效率高,速度快。  2.基于边缘的分割 图像分割的另一种方式是边缘检测时限的边缘是指像素级和边缘可以通过像素灰度的阶跃或屋顶变化勾勒出物体的轮廓,这对图像识别和分析非常有用。它是从图像识别中提取的重要信息。由于边缘灰度不连续,边缘点可以通过边缘检测算子检测到,常用的边缘检测算子有梯度算子,Prewitt算子、Sobel算子、LOG算子和Canny算子等。 通过edge可以用各种边缘检测算子来检测图像边缘。  3.边缘跟踪 将检测到的边缘点连接成线称为边缘跟踪。在识别图像中的目标时,通常需要跟踪目标边缘,即找出边缘点并按一定顺序绘制编辑。如果图像是二值图像或图像中的不同区域有不同的像素值,但每个区域的像素仅相同,则可以完成基于四联通或八联通区域的轮廓跟踪。 利用bwtraceboundary函数可以在二值图像中跟踪目标的轮廓。 利用bwtraceboundary函数可以在二值图像中跟踪目标的轮廓。  4.Hough变换检测 Hough变换是Paul Hough1962年理技术中常用的识别几何形状的方法,实现了从图像空间到参数空间的映射关系。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转换矩阵。函数返回的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是霍夫变换矩阵。参数val一是非负标量,指定H中考虑峰值的值;val1可以从0到Inf变化,默认值是0.5*max(H(:))。参数val二是奇整数的两元素矢量,指定量围绕峰值的邻域大小。 (7)houghline:基于Hough改变提取线元。 lines = houghlines(f, theta, rho, peaks)  lines = houghlines(..., 'FillGap', val1, 'MinLength', val2) 其中,theta和rho是来自函数hough的输出,peaks是函数houghpeaks的输出。输出lines是结构数组(可能检测到多条直线),长度等于找到的线段数。输出lines是结构数组(可能检测到多条直线),长度等于找到的线段数。结构中的每个元素可以看成一条线,并含有下列字段: point一、两元素向量[r1, c1]指定线段起点的行列坐标。 point二、两元素向量[r2, c2]指定线段终点的行列坐标。 theta:以度计量角度与线相关的霍夫变换。 rho:与线相关的霍夫变换ρ轴位置。 其它参数如下: val一是正标量,指定与同一霍夫变换相关的两条线段的距离。当两条线段之间的距离小于指定值时,函数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. 实验中算法的编写总是出现各种各样的错误,经过细心的检查和耐心的改正错误基本都会改正错误。类型大致可分为:语法错误,函数调用,错误函数无法调用等类型。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章