实验五 图像分割

实验五 图像分割

一、实验目的与要求

1. 了解图像分割的意义和常用方法
2. 掌握常用的图像分割方法 

二、实验相关知识

​ 图像分割就是把图像分成互不重叠的区域并提取出感兴趣目标的技术,是由图像处理到图像分析的 关键步骤。

​ 和本实验有关的常用Matlab函数:

​ edge:检测灰度或二值图像的边缘,返回一个二值图像,1像素是检测到的边缘,0像素是非边缘

​ 用法:BW=edge(I,‘sobel’,thresh,direction); %I为检测对象; 边缘检测算子可用sobel、roberts、prewitt、zerocross、log、canny; thresh指定阈值,检测时忽略所有小于阈值的边缘,默认自动选择阈值; direction指定方向,可选项有horizontal、vertical或both, 在指定的方向上用算子进行边缘检测

三、实验内容

  1. 分别用Roberts、Prewitt、Sobel三种边缘检测算子,对图像wire.bmp进行水平、垂直及各个方向的边界检测,并将检测结果转化为白底黑线条的方式显示出来;

    • 源代码

      I = imread('wire.png');
      subplot(4,3,2);
      imshow(I);
      title('wire');
      %Roberts -- horizontal
      Roberts = edge(I,'roberts','horizontal');
      Roberts = oneTozero(Roberts);
      subplot(4,3,4);
      imshow(Roberts);
      title('Roberts-horizontal');
      % Roberts -- vertical
      Roberts = edge(I,'roberts','vertical');
      Roberts = oneTozero(Roberts);
      subplot(4,3,5);
      imshow(Roberts);
      title('Roberts-vertical');
      %Roberts -- both
      Roberts = edge(I,'roberts','both');
      Roberts = oneTozero(Roberts);
      subplot(4,3,6);
      imshow(Roberts);
      title('Roberts-both');
      %Prewitt -- horizontal
      Prewitt = edge(I,'prewitt','horizontal');
      Prewitt = oneTozero(Prewitt);
      subplot(4,3,7);
      imshow(Prewitt);
      title('Prewitt-horizontal');
      %Prewitt -- vertical
      Prewitt = edge(I,'prewitt','vertical');
      Prewitt = oneTozero(Prewitt);
      subplot(4,3,8);
      imshow(Prewitt);
      title('Prewitt-vertical');
      %Prewitt -- both
      Prewitt = edge(I,'prewitt','both');
      Prewitt = oneTozero(Prewitt);
      subplot(4,3,9);
      imshow(Prewitt);
      title('Prewitt-both');
      
      %Sobel -- horizontal
      Sobel = edge(I,'sobel','horizontal');
      Sobel = oneTozero(Sobel);
      subplot(4,3,10);
      imshow(Sobel);
      title('Sobel-horizontal');
      %Sobel -- vertical
      Sobel = edge(I,'sobel','vertical');
      Sobel = oneTozero(Sobel);
      subplot(4,3,11);
      imshow(Sobel);
      title('Sobel-vertical');
      %Sobel -- both
      Sobel = edge(I,'sobel','both');
      Sobel = oneTozero(Sobel);
      subplot(4,3,12);
      imshow(Sobel);
      title('Sobel-both');
      
    • 结果截图

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ObNco0gJ-1624205253990)(https://i.loli.net/2021/06/14/enLAWaKdrIG7xJQ.png)]

  2. 使用手动阈值分割法对bottle图像进行分割,显示分割结果,并分析其优缺点。

    subplot(2,2,);
    img = imread('bottle.jpg');
    imshow(img);
    title('原图');
    subplot(2,2,[3,4]);
    imhist(img);
    [m,n] = size(img);
    thresh = 80;
    for i = 1:m
    	for j = 1:n
    		if(img(i,j) > thresh)
    			img(i,j) = 255;
    		else
    			img(i,j) = 0;
    		end
    	end
    end
    subplot(2,2,2);
    imshow(img);
    title('分割图像');
    
    • 手动阈值分割法:利用直方图进行分析,并根据直方图的波峰和波谷之间的关系,找到一个大概的阈值。准确性较高,但是只适用于存在一个目标和一个背景的,且两者对比明显的图像,且直方图必须是双峰的。限制条件较多。
  3. 对下图A进行处理,得到类似图B的样子.

​ 图A 图B

  • 源代码

    I = imread('imageA.jpg');
    I = rgb2gray(I);
    hist = imhist(I);
    threshold = 111;
    [m,n] = size(I);
    I1 = zeros(m,n);
    for i = 1:m
        for j = 1:n
            if I(i,j) > threshold
                I1(i,j) = 1;
            else
                I1(i,j) = 0;
            end
        end
    end
    I1 = edge(I1,'canny');
    I1 = oneTozero(I1);
    imshow(I1);
    
  • 实验截图

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IUYeJMC0-1624205253993)(https://i.loli.net/2021/06/14/NjGgJpQObTc6t4W.png)]

end
I1 = edge(I1,‘canny’);
I1 = oneTozero(I1);
imshow(I1);
```

  • 实验截图

    [外链图片转存中…(img-IUYeJMC0-1624205253993)]

图像分割是将一幅图像分割成多个子区域,每个子区域具有一定的相似性,而且不同子区域间有明显的差异性。MATLAB提供了许多图像分割的函数,如K均值聚类、区域生长、分水岭算法等。 以下是一些MATLAB中常用的图像分割函数: 1. K均值聚类 K均值聚类是一种简单而有效的图像分割方法。该方法通过对图像像素进行聚类来实现图像分割。在MATLAB中,可以使用kmeans函数实现K均值聚类。 示例代码: ``` % 读取图像 I = imread('lena.jpg'); % 将图像转换为二维数组 I2 = double(reshape(I, [], 3)); % 对图像进行K均值聚类 [idx, C] = kmeans(I2, 2); % 将聚类结果转换为图像 I3 = reshape(idx, size(I, 1), size(I, 2)); % 显示聚类结果 imshow(I3, []); ``` 2. 区域生长 区域生长是基于邻域像素相似性的图像分割方法。该方法从一个种子像素开始,逐步将与该像素相邻的像素加入到同一区域中。在MATLAB中,可以使用regiongrowing函数实现区域生长。 示例代码: ``` % 读取图像 I = imread('lena.jpg'); % 对图像进行区域生长 J = regiongrowing(I, 100, 100, 20); % 显示生长结果 imshow(J); ``` 3. 分水岭算法 分水岭算法是一种基于图像梯度的图像分割方法。该方法将图像看作是一个地形图,通过将图像分割成多个区域来实现图像分割。在MATLAB中,可以使用watershed函数实现分水岭算法。 示例代码: ``` % 读取图像 I = imread('lena.jpg'); % 对图像进行梯度计算 I2 = imgradient(I); % 对梯度图像进行分水岭算法 L = watershed(I2); % 显示分割结果 imshow(label2rgb(L, 'jet', 'w')); ``` 以上是MATLAB中常用的图像分割函数,可以根据实际需求选择合适的函数进行图像分割
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值