zoukankan      html  css  js  c++  java
  • 数字图像边缘检测

     

    所有结果均是参考百度文库:http://wenku.baidu.com/link?url=Vyc2wB3Hl_LDtpp7JsVN_-MVGqw6Is1QyTfo2Yrl6jiWoU6G_kJ2I1w8x05qsJIpSCKWXtU_7Z0T2fuQwsc8t585BJr27Ijq2zPPietinjO

     

    首先介绍了几种常见的数字图像边缘检测算法,然后给出检测结果,并给出matlab代码。

     

    Roberts算子:采用对角线方向相邻两像素之差表示信号的突变,检测水平和垂直方向边缘的性能好于斜线方向,定位精度比较高,但对噪声敏感,检测出的边缘较细。

    Prewitt算子:对噪声有平滑作用,检测出的边缘比较粗,定位精度低,容易损失角点。

    Kirsch算子:Kirsch算子是像素邻域的加权和,模板中心值较大,不但产生较好的边缘效果,而且对噪声具有平滑作用。但存在伪边缘,边缘比较粗且定位精度低。

    Laplacian算子:是二阶微分算子,对图像中的阶跃性边缘点定位准确,对噪声非常敏感,丢失一部分边缘的方向信息,造成一些不连续的检测边缘。

    LoG算子:首先用高斯函数进行滤波,然后使用Laplacian算子检测边缘,克服了Laplacian算子抗噪声能力比较差的缺点。

    Canny算子:采用高斯函数对图像进行平滑处理,因此具有较强的噪声抑制能力;同样该算子也将一些高频边缘平滑掉,造成边缘丢失,采用了双阈值算法检测和连接边缘,边缘的连续性较好。

    Sobel算子:产生的边缘效果较好,对噪声具有平滑作用。但存在伪边缘,边缘比较粗且定位精度低。

    八方向Sobel算子:可以得到更完整的边缘信息,但是和Sobel算子一样,它们的抗噪声能力都较差,即对于叠加噪声图像的边缘检测效果很不理想。

    最佳Sobel算子:在图像进行八方向Sobel算子检测后的梯度图像使用最佳阈值分割图像,解决了八方向Sobel算子抗噪能力差的特点,在去噪的同时有效地保留了图像的真实边缘,即给出了边缘检测的最佳结果。但这种算法对于部分灰度图像的检测结果并不理想,甚至无法检测。至于具体原因还有待进一步的研究。

     

     

    clc

    clear all

    close all

    A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像

    imshow(A);title('原图');

    x_mask = [1 0;0 -1]; % 建立X方向的模板

    y_mask = rot90(x_mask); % 建立Y方向的模板

    I = im2double(A); % 将图像数据转化为双精度

    dx = imfilter(I, x_mask); % 计算X方向的梯度分量

    dy = imfilter(I, y_mask); % 计算Y方向的梯度分量

    grad = sqrt(dx.*dx + dy.*dy); % 计算梯度

    grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像

    level = graythresh(grad); % 计算灰度阈值

    BW = im2bw(grad,level); % 用阈值分割梯度图像

    figure, imshow(BW); % 显示分割后的图像即边缘图像

    title('Roberts')

     

     

    clc

    clear all

    close all

    A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像

    imshow(A);title('原图');

    y_mask = [-1 -1 -1;0 0 0;1 1 1]; % 建立Y方向的模板

    x_mask = y_mask'; % 建立X方向的模板

    I = im2double(A); % 将图像数据转化为双精度

    dx = imfilter(I, x_mask); % 计算X方向的梯度分量

    dy = imfilter(I, y_mask); % 计算Y方向的梯度分量

    grad = sqrt(dx.*dx + dy.*dy); % 计算梯度

    grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像

    level = graythresh(grad); % 计算灰度阈值

    BW = im2bw(grad,level); % 用阈值分割梯度图像

    figure, imshow(BW); % 显示分割后的图像即边缘图像

    title('Prewitt')

     

     

    clc

    clear all

    close all

    A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像

    imshow(A);title('原图');

    mask1=[-3,-3,-3;-3,0,5;-3,5,5]; % 建立方向模板

    mask2=[-3,-3,5;-3,0,5;-3,-3,5];

    mask3=[-3,5,5;-3,0,5;-3,-3,-3];

    mask4=[-3,-3,-3;-3,0,-3;5,5,5];

    mask5=[5,5,5;-3,0,-3;-3,-3,-3];

    mask6=[-3,-3,-3;5,0,-3;5,5,-3];

    mask7=[5,-3,-3;5,0,-3;5,-3,-3];

    mask8=[5,5,-3;5,0,-3;-3,-3,-3];

    I = im2double(A); % 将数据图像转化为双精度

    d1 = imfilter(I, mask1); % 计算8个领域的灰度变化

    d2 = imfilter(I, mask2);

    d3 = imfilter(I, mask3);

    d4 = imfilter(I, mask4);

    d5 = imfilter(I, mask5);

    d6 = imfilter(I, mask6);

    d7 = imfilter(I, mask7);

    d8 = imfilter(I, mask8);

    dd = max(abs(d1),abs(d2)); % 取差值变化最大的元素组成灰度变化矩阵

    dd = max(dd,abs(d3));

    dd = max(dd,abs(d4));

    dd = max(dd,abs(d5));

    dd = max(dd,abs(d6));

    dd = max(dd,abs(d7));

    dd = max(dd,abs(d8));

    grad = mat2gray(dd); % 将灰度变化矩阵转化为灰度图像

    level = graythresh(grad); % 计算灰度阈值

    BW = im2bw(grad,level); % 用阈值分割梯度图像

    figure, imshow(BW); % 显示分割后的图像,即边缘图像

    title('Kirsch')

     

     

    clc

    clear all

    close all

    A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像

    imshow(A);title('原图');

    mask=[0,-1,0;-1,4,-1;0,-1,0]; % 建立模板

    I = im2double(A); % 将数据图像转化为双精度

    dx = imfilter(I, mask); % 计算梯度矩阵

    grad = mat2gray(dx); % 将梯度矩阵转化为灰度图像

    BW = im2bw(grad,0.58); % 用阈值分割梯度图像

    figure, imshow(BW); % 显示分割后的图像,即梯度图像

    title('Laplacian')

     

     

    clc

    clear all

    close all

    A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像

    imshow(A);title('原图');

    mask=[0,0,-1,0,0;0,-1,-2,-1,0;-1,-2,16,-2,-1;0,-1,-2,-1,0;0,0,-1,0,0]; % 建立模板

    I = im2double(A); % 将数据图像转化为双精度

    dx = imfilter(I, mask); % 计算梯度矩阵

    grad = mat2gray(dx); % 将梯度矩阵转化为灰度图像

    BW = im2bw(grad,0.58); % 用阈值分割梯度图像

    figure, imshow(BW); % 显示分割后的图像,即梯度图像

    title('log')

     

     

    clc

    clear all

    close all

    A = imread('C:UsersYanoDesktop4.jpg'); % 读入图像

    imshow(A);title('原图');

    y_mask = [-1 -2 -1;0 0 0;1 2 1]; % 建立Y方向的模板

    x_mask = y_mask'; % 建立X方向的模板

    I = im2double(A); % 将图像数据转化为双精度

    dx = imfilter(I, x_mask); % 计算X方向的梯度分量

    dy = imfilter(I, y_mask); % 计算Y方向的梯度分量

    grad = sqrt(dx.*dx + dy.*dy); % 计算梯度

    grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像

    level = graythresh(grad); % 计算灰度阈值

    BW = im2bw(grad,level); % 用阈值分割梯度图像

    figure, imshow(BW); % 显示分割后的图像即边缘图像

    title('Sobel')

  • 相关阅读:
    Go grpc 基本使用
    线程之间的数据库隔离方案
    mysql创建用户并设置所有权限
    Mysql InnoDB 共享表空间和独立表空间
    DB2错误码信息
    PhotoshopManager(缩放图片file---->byte[])
    SaveManager+DownloadManager(下载img,voice以及保存)
    ViewPager
    RegistereManager
    ServiceManager
  • 原文地址:https://www.cnblogs.com/510602159-Yano/p/3776056.html
Copyright © 2011-2022 走看看