• matlab中图像分割技术之一边缘检测


    1.边缘检测
    (1)Roberts边缘算子
    (2)Sobel算子
    (3)Prewitt算子
    (4)拉普拉斯(Laplacian)算子
    (5)LOG(Laplacian-Gauss)算子
    (6)坎尼(Canny)算子
    (7)利用霍夫(Hough)变换

    图像分割技术图像分割是把图像分割成若干个特定的、具有独特性质的区域并提取出感兴趣的目标的技术和过程。在对图像的研究和应用中,人们往往仅对图像的某些部分感兴趣(目标或背景),他们一般对应图像中特定的、具有独特性质的区域。
    **(1)多种特征融合的分割方法:**除利用图像的原始灰度特征外,我们还可以利用图像的梯度特征、几何特征(形态、坐标、距离、方向、曲率等)、变换特征(傅里叶谱、小波特征、分形特征等)及统计学特征(纹理、不变矩、灰度均值等)等高层次特征。
    **(2)多种分割方法结合的分割方法:**由于目标成像的不确定性以及目标的多样性,单一的分割方法很难对含复杂目标的图像取得理想的分割结果。

    一、边缘检测

    边缘(Edge)是指图像局部亮度变化最显著的部分。边缘主要存在于目标、目标与背景、区域与区域(包括不同色彩)之间,是图像分割、纹理特征提取和形状特征提取等图像分析的重要基础。
    (1)Roberts边缘算子
    一种斜向偏差分的梯度计算方法,梯度的大小代表边缘的强度,梯度的方向与边缘走向垂直。Roberts操作实际上是求旋转±45°两个方向上微分值的和。Roberts边缘算子定位精度高,在水平和垂直方向效果较好,但对噪声敏感。
    两个卷积核Gx=[1 0 0 -1],Gy=[0 1 -1 0]

    clc;                %clc的作用就是清屏幕
    clear;              %clear是删除所有的变量
    close all;          %close all是将所有打开的图片关掉。
    i=imread('E:\我的桌面\MATLAB\练习\3.jpg'); %读取图像
    I=im2gray(i);
    BW1=edge(I, 'Roberts',0.04);    %Roberts算子检测边缘
    subplot(1,2,1),
    imshow(I);
    title('原图像')
    subplot(1,2,2),
    imshow(BW1);
    title('Roberts算子检测边缘')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述
    (2)Sobel算子
    Sobel算子是一组方向算子,从不同的方向检测边缘。Sobel算子不是简单的求平均再差分,而是加强了中心像素上下左右四个方向像素的权重,运算结果是一副边缘图像。Sobel算子通常对灰度渐变和噪声较多的图像处理得较好。
    两个卷积核Gx=[-1 0 1 -2 0 2 -1 0 1],Gy=[1 2 1 0 0 0-1 -2 -1]

    clc;                %clc的作用就是清屏幕
    clear;              %clear是删除所有的变量
    close all;          %close all是将所有打开的图片关掉。
    i=imread('E:\我的桌面\MATLAB\练习\3.jpg'); %读取图像
    I=im2gray(i);
    BW1=edge(I, 'Sobel',0.04);  %Sobel算子检测边缘
    subplot(1,2,1),
    imshow(I);
    title('原图像')
    subplot(1,2,2),
    imshow(BW1);
    title('Sobel算子检测边缘')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述
    (3)Prewitt算子
    Prewitt边缘算子是一种边缘样板算子,利用像素点上下、左右邻点灰度差,在边缘处达到极值检测边缘,对噪声具有平滑作用。由于边缘点像素的灰度值与其领域点像素的灰度值有显著不同,在实际应用中通常采用微分算子和模板匹配方法检测图像的边缘。Prewitt算子不仅能检测边缘点,而且能抑制噪声的影响,因此对灰度和噪声较多的图像处理得较好。
    两个卷积核Gx=[-1 0 1 -2 0 2 -1 0 1],Gy=[1 2 1 0 0 0-1 -2 -1]

    clc;                %clc的作用就是清屏幕
    clear;              %clear是删除所有的变量
    close all;          %close all是将所有打开的图片关掉。
    i=imread('E:\我的桌面\MATLAB\练习\3.jpg'); %读取图像
    I=im2gray(i);
    BW1=edge(I, 'prewitt',0.04);     % 0.04为梯度阈值
    subplot(1,2,1)
    imshow(I);
    title('原图像')
    subplot(1,2,2),
    imshow(BW1);
    title('Prewitt算子检测边缘')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述
    (4)拉普拉斯(Laplacian)算子
    如果所求的一阶导数高于某一阈值,则可确定该点为边缘点,这样做会导致检测的边缘点太多。一种更好的方法就是求梯度局部最大值对应的点,并认定它们是边缘点,若用阈值来进行边缘检测,则在a和b之间的所有点都被记为边缘点。但通过去除一阶导数中的非局部最大值,可以检测出更精确的边缘。
    (5)LOG(Laplacian-Gauss)算子
    高斯滤波和拉普拉斯边缘检测结合在一起,形成LOG算法,也称之为拉普拉斯高斯算法。LOG算子是对Laplacian算子的一种改进,它需要考虑5×5邻域的处理,从而获得更好的检测效果。

    clc;                %clc的作用就是清屏幕
    clear;              %clear是删除所有的变量
    close all;          %close all是将所有打开的图片关掉。
    i=imread('E:\我的桌面\MATLAB\练习\3.jpg'); %读取图像
    I=im2gray(i);
    BW1=edge(I, 'log',0.003,2);                 %sigma=2
    subplot(1,3,1);
    imshow(I);
    title('原图像')
    subplot(1,3,2);
    imshow(BW1);
    title(' sigma =2的LOG算子检测的边缘')
    BW1=edge(I, 'log',0.003,3);                 % sigma=3
    subplot(1,3,3);
    imshow(BW1);
    title('sigma =3的LOG算子检测的边缘')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    (6)坎尼(Canny)算子
    检测阶跃边缘的基本思想是在图像中找出具有局部最大梯度幅值的像素点。检测阶跃边缘的大部分工作集中在寻找能够用于实际图像的梯度数字逼近。

    clc;                %clc的作用就是清屏幕
    clear;              %clear是删除所有的变量
    close all;          %close all是将所有打开的图片关掉。
    i=imread('E:\我的桌面\MATLAB\练习\3.jpg'); %读取图像
    I=im2gray(i);
    BW1=edge(I, 'canny',0.2);      %Canny算子边缘检测
    subplot(1,2,1);
    imshow(I);
    title('原图像')
    subplot(1,2,2);
    imshow(BW1);
    title('Canny算子边缘检测')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    %%所有都放一起比较
    clc;                %clc的作用就是清屏幕
    clear;              %clear是删除所有的变量
    close all;          %close all是将所有打开的图片关掉。
    i=imread('E:\我的桌面\MATLAB\练习\3.jpg'); %读取图像
    I=im2gray(i);
    BW1=edge(I, 'Roberts',0.04);        %Roberts算子
    BW2=edge(I, 'Sobel',0.04);          %Sobel算子
    BW3=edge(I, 'Prewitt',0.04);        %Prewitt算子
    BW4=edge(I, 'LOG',0.004);           % LOG算子
    BW5=edge(I, 'Canny',0.04);          % Canny算子
    subplot(2,3,1),
    imshow(I);
    title('原图像');
    subplot(2,3,2),
    imshow(BW1)
    title('Roberts ')
    subplot(2,3,3),
    imshow(BW2)
    title(' Sobel ')
    subplot(2,3,4),
    imshow(BW3)
    title(' Prewitt ')
    subplot(2,3,5),
    imshow(BW4)
    title(' LOG ')
    subplot(2,3,6),
    imshow(BW5)
    title('Canny ')
    
    • 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

    在这里插入图片描述
    Roberts算子提取边缘的结果边缘较粗,边缘定位不很准确,Sobel算子和Prewitt算子对边缘的定位就准确了一些,而采用拉普拉斯高斯算子进行边缘提取的结果要明显优于前三种算子,特别是边缘比较完整,位置比较准确。相比而言,Canny算子提取的边缘最为完整,而且边缘的连续性很好,效果优于以上其他算子,这主要是因为它进行了“非极大值抑制”和形态学连接操作的结果。

    (7)利用霍夫(Hough)变换
    检测图像边缘的算法Hough变换本来是应用于直线检测中的,充分体现了Hough变换具有明了的几何解析性、一定的抗干扰能力以及易于实现并行处理等优点。

    		clc;                %clc的作用就是清屏幕
    		clear;              %clear是删除所有的变量
    		close all;          %close all是将所有打开的图片关掉。
    		I=imread('E:\我的桌面\MATLAB\练习\3.jpg'); %读取图像
    		rotI=rgb2gray(I);
    		subplot(2,2,1);
            imshow(rotI);
            title('灰度图像');
            axis([50,250,50,200]);
            grid on;
            axis on;
            BW=edge(rotI, 'prewitt');          %prewitt算子边缘检测
            subplot(2,2,2);
            imshow(BW);
            title('prewitt算子边缘检测后图像');
            axis([50,250,50,200]);
            grid on;
            axis on;
            [H, T, R]=hough(BW);               %霍夫变换
            subplot(2,2,3);
            imshow(H, [], 'XData', T, 'YData', R, 'InitialMagnification', 'fit');
            title('霍夫变换图');
            xlabel('\theta'), ylabel('\rho');
            axis on , axis normal, hold on;
            P=houghpeaks(H,5, 'threshold', ceil(0.3*max(H(:))));
            x=T(P(:,2)); y=R(P(:,1));
            plot(x, y, 's', 'color', 'white');
            lines=houghlines(BW, T, R, P, 'FillGap',5, 'MinLength',7);
            subplot(2,2,4); , imshow(rotI);
            title('霍夫变换图像检测');
            axis([50,250,50,200]);
            grid on;
            axis on;
            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), 'x', 'LineWidth',2, 'Color', 'yellow');
            plot(xy(2,1), xy(2,2), 'x', 'LineWidth',2, 'Color', 'red');
            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', 'cyan');
    
    • 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

    在这里插入图片描述

  • 相关阅读:
    2562. 找出数组的串联值
    Flutter 图表组件 charts_flutter_new
    产品结构设计的主要内容有哪些?
    django_model_一对一映射
    uvm核心
    ChatGPT⼊门到精通(5):ChatGPT 和Claude区别
    【@property的参数copy Objective-C语言】
    百面机器学习书刊纠错
    区块链技术与应用
    go的编译以及运行时环境
  • 原文地址:https://blog.csdn.net/qq_55433305/article/details/128139694