• 实验五 图像分割与描述


    一、实验目的:
    (1)进一步掌握图像处理工具Matlab,熟悉基于Matlab的图像处理函数。
    (2)掌握图像分割方法,熟悉常用图像描述方法。
    二、实验原理(略)
    三、实验步骤(包括分析、代码和波形)
    首先来看看这个实验的要求。实验主要涉及打开一幅图像Image,使用Matlab图像处理函数,对其进行下列变换:
    (1)将Image灰度化为gray,对其进行阈值分割转换为BW;
    (2)对BW进行数学形态学滤波;
    (3)对BW进行边缘跟踪,用红色线在图中标出;
    (4)计算各区域边界点的傅里叶描绘子并用四分之一点重建边界;
    (5)实验要求中的拓展内容。
    拓展内容:
    (1)尝试不同的阈值选择方法,实现灰度图像二值化;
    (2)变换参数实现形态学滤波,查看滤波效果;
    (3)更改重建边界点数,查看效果;
    (4)自行设计方法实现图像分割,并计算分割区域相关参数。

    实验的思路是很明确的,结合原理中的讨论,我们只要按照题目的要求来编写代码、查看和记录波形并进行验证就可以了,不需要计算。

    **下面是第(1)小题的代码。**这一部分需要注意的是imbinarize函数,它可以指定的方法获取阈值实现灰度图像I的二值化:

    Image1=im2double(imread('apple.png'));
    gray=rgb2gray(Image1);
    T=graythresh(gray);
    BW=im2bw(gray,T);
    figure,imshow(BW),title('二值化图像');
    
    • 1
    • 2
    • 3
    • 4
    • 5

    下面的图给出了将Image灰度化为gray,对其进行阈值分割转换为BW的二值化图像。
    在这里插入图片描述

    **下面是第(2)小题的代码。**对BW进行数学形态学滤波,strel函数可以创建形态学结构元素。

    SE=strel('square',3);
    Morph=imopen(BW,SE); 
    Morph=imclose(Morph,SE);
    figure,imshow(Morph),title('形态学滤波');
    
    • 1
    • 2
    • 3
    • 4

    得到的形态学滤波如下图:
    在这里插入图片描述

    下面是第(3)小题的代码。对BW进行边缘跟踪,用红色线在图中标出,bwboundaries函数,可以搜索二值图像BW的外边界和内边界。

    [B L]=bwboundaries(1-Morph);
    figure,imshow(L),title('划分的区域');
    hold on;
    for i=1:length(B)
        boundary=B{i};
        plot(boundary(:,2),boundary(:,1),'r','LineWidth',2);
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    得到的划分的区域的图如下:
    在这里插入图片描述

    下面是第(4)小题的代码。计算各区域边界点的傅里叶描绘子并用四分之一点重建边界,ifft和ifft2函数
    ifft(X):对X进行IDFT运算,ifft2(F):对F进行二维IDFT运算。

    M=zeros(length(B));                        
    for k=1:length(B)                            
        N=length(B{k});                          
        if N/2~=round(N/2)                       
            B{k}(end+1,:)=B{k}(end,:);             
            N=N+1;
        end
        M(k)=[N*3/4];      
    end
    S=zeros(size(Morph));                           
    figure,imshow(S),title('重建图像');
    hold on;
    for k=1:length(B) 
        z=B{k}(:,2)+1i*B{k}(:,1); 
        Z=fft(z);                            
        [Y I]=sort(abs(Z));                    
        for count=1:M(k)                    
            Z(I(count))=0;                   
        end
        zz=ifft(Z);                           
        plot(real(zz),imag(zz),'w');              
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    得到的重建图像的图为:
    在这里插入图片描述

    拓展内容:
    **下面是拓展内容第(1)小题的代码。**尝试不同的阈值选择方法,实现灰度图像二值化。

    close all;
    clc;
    clear;
     
    % 1.计算均值、方差
    Thre=128;                 %手动设置阈值
    I=imread('apple.png');   %载入真彩色图像
    I=rgb2gray(I);            %转换为灰度图像
    figure;imhist(I);
    a=find(I<Thre);
    b=find(I>=Thre);
    e1=mean(I(a));
    e2=mean(I(b));
    std1 = std(im2double(I(a)) * 255, 0);
    std2 = std(im2double(I(b)) * 255, 0);
     
     
    % 3.固定阈值分割方法
    I1=im2bw(I,Thre/256);
    figure,imshow(I1),title('固定阈值分割方法(取经验值为128)');
     
    % 4.自动阈值选择分割法
     
    f=im2double(I);              %数据类型转换
    T=0.5*(min(f(:))+max(f(:)));
    done=false;
    while ~done
        g=f>=T;
        Tn=0.5*(mean(f(g))+mean(f(~g)));
        done = abs(T-Tn)<0.1;
        T=Tn;
    end
    disp('Threshold(T)-Iterative');%显示文字
     
    r=im2bw(f,T);
    figure;
    subplot(221),imshow(r);
    xlabel('迭代法分割效果图(填充前)');
    r=imfill(r,'holes');%将原图填充孔洞
    subplot(222),imshow(r);
    xlabel('迭代法分割效果图(填充后)');
     
    Th=graythresh(f);%阈值
    disp('Global Thresholding- Otsu''s Method');
     
    s=im2bw(f,Th);
    subplot(223),imshow(s);
    xlabel('Otsu法分割效果图(填充前)');
    s=imfill(s,'holes');%将原图填充du孔洞
    subplot(224),imshow(s);
    xlabel('Otsu法分割效果图(填充后)');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    得到的灰度图像二值化的图为:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    下面是拓展内容第(2)小题的代码。变换参数实现形态学滤波,查看滤波效果。

    Image1=im2double(imread('apple.png'));
    gray=rgb2gray(Image1);
    T=graythresh(gray);
    BW=im2bw(gray,T);
    figure,imshow(BW),title('二值化图像');
    SE=strel('disk',3);
    Morph=imopen(BW,SE);
    Morph=imclose(Morph,SE);
    figure,imshow(Morph),title('形态学滤波');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    变换参数实现形态学滤波得到的图为:
    在这里插入图片描述
    在这里插入图片描述

    **下面是拓展内容第(3)小题的代码。**更改重建边界点数,查看效果。

    Image1=im2double(imread('apple.png')); 
    gray=rgb2gray(Image1); 
    T=graythresh(gray); 
    BW=im2bw(gray,T); 
    [B L]=bwboundaries(1-BW); 
    figure,imshow(L),title('划分的区域'); 
    hold on; 
    for i=1:length(B) 
    boundary=B{i}; 
    plot(boundary(:,2),boundary(:,1),'r','LineWidth',1); 
    end 
    M=zeros(length(B),4); 
    for k=1:length(B) 
    N=length(B{k}); 
    if N/2~=round(N/2) 
    B{k}(end+1,:)=B{k}(end,:); 
    N=N+1; 
    end 
    M(k,:)=[N/2 N*7/8 N*15/16 N*63/64]; 
    end 
    S=zeros(size(Morph)); 
    for m = 1:4 
    figure,imshow(S); 
    hold on; 
    for k=1:length(B) 
    z=B{k}(:,2)+1i*B{k}(:,1);Z=fft(z); 
    [Y I]=sort(abs(Z)); 
    for count=1:M(k,m) 
    Z(I(count))=0; 
    end 
    zz=ifft(Z); 
    plot(real(zz),imag(zz),'w'); 
    end 
    end 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    更改重建边界点数,得到的图为:
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    N/2项重建
    在这里插入图片描述

    N/8项重建
    在这里插入图片描述

    N\16项重建

    **下面是拓展内容第(4)小题的代码。**自行设计方法实现图像分割,并计算分割区域相关参数。
    使用距离变换的分水岭分割
    最常用的分水岭变换分割的是距离变换,主要是用于二值图像的处理,它是指从每个像素到最接近零值的像素的距离。

    f = imread('apple.png');
    subplot(231),imshow(f),title('原始图像');
    g = im2bw(f,graythresh(f));   %把图像变换成二值图像
    subplot(232),imshow(g),title('二值图像');
    gc = ~g;
    subplot(233),imshow(gc),title('补的图像');
    D = bwdist(gc);
    subplot(234),imshow(D),title('距离变换图像');
    L = watershed(-D);
    w = L == 0;
    subplot(235),imshow(w),title('负分水岭脊的图像');
    g2 = g&-w;
    subplot(236),imshow(g2),title('黑色重叠后的图像');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    图像分割后的图像为:
    在这里插入图片描述

    四、实验总结
    通过本次实验,了解了关于彩色图像分割需面临以下两个难题:(1)选择适当的分割方法;(2)选择合适的颜色空间。颜色特征空间的选择要按照具体的图像和分割方法而定,当前尚无一种颜色空间能够替换别的的空间而适合全部的彩色图像分割,由此可见选择适合的特征空间是彩色图像分割的一个困难数字图像处理的方法有许多,要想获得图像分割的最好结果,务必采取多种方法相结合。

  • 相关阅读:
    染色法判断二分图
    ddt源码分析
    我凭这个引流套路做到月入10万+,你也可以(瞎编的)
    Docker学习第一天
    《LeetCode力扣练习》代码随想录——链表(反转链表---Java)
    【LeetCode】滑动窗口题解汇总
    STM32数据类型重定义说明
    spring-data Page/Sort类型 jackson序列化模块
    [前端开发] 前端工程代码规范 Husky + Commitlint + Prettier + Eslint + Stylelint
    stack-es-标准篇-ElasticsearchClient-function_score
  • 原文地址:https://blog.csdn.net/m0_52014276/article/details/125600332