Matlab实现图像边缘检测

为了在一幅图像 f 的(x,y)位置寻找边缘的强度和方向,所选择的工具就是梯度,梯度使用向量来表示:

该向量指出了图像 f 在位置(x,y)处的最大变化率的方向,梯度向量的大小表示为:

它是梯度向量方向变化率的值。
梯度向量的方向表示为:

梯度算子

roberts算子:

sobel算子:

prewitt算子:

Matlab实现

function output = my_edge(input_img,method)
if size(input_img,3)==3
    input_img=rgb2gray(input_img);
end

input_img=im2double(input_img);
sobel_x=[-1,-2,-1;0,0,0;1,2,1];
sobel_y=[-1,0,1;-2,0,2;-1,0,1];
prewitt_x=[-1,-1,-1;0,0,0;1,1,1];
prewitt_y=[-1,0,1;-1,0,1;-1,0,1];

psf=fspecial('gaussian',[5,5],1);
input_img=imfilter(input_img,psf);%高斯低通滤波,平滑图像,但可能会使图像丢失细节
input_img=medfilt2(input_img); %中值滤波消除孤立点
[m,n]=size(input_img);
output=zeros(m,n);
if nargin==2
    if strcmp(method,'sobel')
        for i=2:m-1
            for j=2:n-1
                local_img=input_img(i-1:i+1, j-1:j+1);
%近似边缘检测,加快速度    %output(i,j)=abs(sum(sum(sobel_x.*local_img)))+abs(sum(sum(sobel_x.*local_img)));
                output(i,j)=sqrt(sum(sum(sobel_x.*local_img))^2+sum(sum(sobel_y.*local_img))^2);
            end
        end
    elseif strcmp(method,'prewitt')
          for i=2:m-1
            for j=2:n-1
                local_img=input_img(i-1:i+1, j-1:j+1);
                output(i,j)=sqrt(sum(sum(prewitt_x.*local_img))^2+sum(sum(prewitt_y.*local_img))^2);
            end
          end
    else
        errordlg('maybe you should input sobel or prewitt');
    end
else  %如果不输入算子的名称,默认使用roberts算子进行边缘检测
    for i=1:m-1
        for j=1:n-1
            output(i,j)=abs(input_img(i,j)-input_img(i+1,j+1))+ ...
                abs(input_img(i+1,j)-input_img(i,j+1));
        end
    end
end

output=imadjust(output);%使边缘图像更明显
thresh=graythresh(output);%确定二值化阈值
output=bwmorph(im2bw(output,thresh),'thin',inf);%强化细节
end

代码效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Matlab 数字图像的滤波及边缘检测

    目录 一.图像滤波 1.1 线性滤波器 1.1.1 均值滤波 1.1.2 高斯滤波 1.2 非线性滤波器 1.2.1 中值滤波器 1.2.2 双边滤波器 1.3 滤波器的 Matlab 代码实现 二.图像边缘检测 2.1 一阶边缘检测算子 2.1.1 Sobel 算子 2.1.2 Canny 算子 2.2 二阶边缘检测算子 2.2.1 拉普拉斯算子 2.3 边缘检测的 Matlab 代码实现 2.4 边缘检测算法总结 三.参考资料 一.图像滤波 图像滤波的主要目的就是在尽量保留图像细节特征的条件

  • Matlab实现图像边缘检测

    为了在一幅图像 f 的(x,y)位置寻找边缘的强度和方向,所选择的工具就是梯度,梯度使用向量来表示: 该向量指出了图像 f 在位置(x,y)处的最大变化率的方向,梯度向量的大小表示为: 它是梯度向量方向变化率的值. 梯度向量的方向表示为: 梯度算子 roberts算子: sobel算子: prewitt算子: Matlab实现 function output = my_edge(input_img,method) if size(input_img,3)==3 input_img=rgb2gra

  • C#图像边缘检测(Roberts)的方法

    本文实例讲述了C#图像边缘检测(Roberts)的方法.分享给大家供大家参考.具体如下: //定义roberts算子函数 private static Bitmap robert(Bitmap a) { int w = a.Width; int h = a.Height; try { Bitmap dstBitmap = new Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Imag

  • C语言实现BMP图像边缘检测处理

    本文实例为大家分享了C语言实现BMP图像边缘检测处理的具体代码,供大家参考,具体内容如下 以Sobel算子为例,其余模板算子卷积代码部分同Sobel算子.如:高斯算子.拉普拉斯算子等 #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <math.h> int main(int* argc, char** argv) { FILE* fp = fopen("./0

  • Matlab处理图像后实现简单的人脸检测

    1.人脸检测原理框图 整体思路是寻找图片中最大的连通域,将其认定为人脸. 第一个环节均值滤波,是为了减弱图像的相关细节部分,以免毛刺影响后期连通域的形成,二值化方便形态学处理,减少运算量.考虑到人脸有黑人和白人黄种人,黑人肤色较深,在二值化之后面部区域不容易形成较大的连通域,如果采取形态学边界提取的办法,就可以避免这个问题,形态学边界提取,只要结构元素够大,也可以形成较大的封闭连通域. 然后就是纵向闭合操作,这一步我选择采用竖向长条状的结构元素进行闭合运算,因为人的脸部和颈部以及头发和衣物等等都

  • Python+OpenCV 图像边缘检测四种实现方法

    目录 1.Sobel算子 2.Schaar算子(更能体现细节) 3.Laplacian算子(基于零穿越的,二阶导数的0值点) 4.Canny边缘检测(被认为是最优的边缘检测算法) 总结 import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 设置兼容中文 plt.rcParams['font.family'] = ['sans-serif'] plt.rcParams['font.sans-serif'] = [

  • 详解Python中图像边缘检测算法的实现

    目录 写在前面 1.一阶微分算子 1.1 Prewitt算子 1.2 Sobel算子 2.二阶微分算子 2.1 Laplace算子 2.2 LoG算子 3.Canny边缘检测 写在前面 从本节开始,计算机视觉教程进入第三章节——图像特征提取.在本章,你会见到一张简简单单的图片中蕴含着这么多你没注意到的细节特征,而这些特征将会在今后更高级的应用中发挥着极其重要的作用.本文讲解基础特征之一——图像边缘. 本文采用面向对象设计,定义了一个边缘检测类EdgeDetect,使图像边缘检测算法的应用更简洁,

  • python实现图像边缘检测

    本文实例为大家分享了python实现图像边缘检测的具体代码,供大家参考,具体内容如下 任务描述 背景 边缘检测是数字图像处理领域的一个常用技术,被广泛应用于图像特征提取.目标识别.计算机视觉等领域.边缘可以理解为像素值发生跃迁的地方,而边缘检测就是要找到这样的地方.如下图所示,对左图进行边缘检测,结果为右图. 基于卷积运算可实现边缘检测,对图像 1(设分辨率为 w×h)进行边缘检测的方法如下: 1)将图像 1 转换成灰度图,仍称为图像 1:2)新建图像 2,图像 2 为灰度图,分辨率与图像 1

  • Python如何使用cv2.canny进行图像边缘检测

    目录 使用cv2.canny进行图像边缘检测 阈值对检测结果的影响 sobel算子对检测结果的影响 范数对检测结果的影响 总结 使用cv2.canny进行图像边缘检测 CV2提供了提取图像边缘的函数canny. 其算法思想如下: 1.使用高斯模糊,去除噪音点(cv2.GaussianBlur) 2.灰度转换(cv2.cvtColor) 3.使用sobel算子,计算出每个点的梯度大小和梯度方向 4.使用非极大值抑制(只有最大的保留),消除边缘检测带来的杂散效应 5.应用双阈值,来确定真实和潜在的边

  • Python利用OpenCV和skimage实现图像边缘检测

    目录 一.简介 二.opencv 实践 三.skimage 实践 一.简介 提取图片的边缘信息是底层数字图像处理的基本任务之一.边缘信息对进一步提取高层语义信息有很大的影响.大部分边缘检测算法都是上个世纪的了,OpenCV 的使用的算法是 Canny 边缘检测算法,大概是在 1986 年由 John F. Canny 提出了,似乎说明边缘检测算法的研究已经到达了瓶颈期.跟人眼系统相比,边缘检测算法仍然逊色不少. Canny 边缘检测算法是比较出色的算法,也是一种多步算法,可用于检测任何输入图像的

  • python进行图像边缘检测的详细教程

    目录 边缘检测 边缘检测算子 1.Roberts算子 2.Prewitt算子 3.Sobel算子 4.Canny算子 5.拉普拉斯算子 效果实验 1. Roberts边缘检测 2.Prewitt 边缘检测 3.Sobel边缘检测 4.Canny边缘检测 5.Laplacian 边缘检测 总结 边缘检测 图像边缘是指图像中表达物体的周围像素灰度发生阶跃变化的那些像素集合. 图像中两个灰度不同的相邻区域的交界处,必然存在灰度的快速过渡或称为跳变,它们与图像中各区域边缘的位置相对应,边缘蕴含了丰富的内

随机推荐