dog算子处理图片边界matlab代码,圖像邊緣檢測——二階微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab實現)...

本文主要是介绍dog算子处理图片边界matlab代码,圖像邊緣檢測——二階微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab實現)...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果圖像灰度變化劇烈,進行一階微分則會形成一個局部的極值,由數學上的知識,對圖像進行二階微分則會形成一個過零點,並且在零點兩邊產生一個波峰和波谷,我們要設定一個閾值,檢測到這個過零點,如下圖所示:

40f7bb227f6e8b9718f251146bf336dc.png

帶來了兩個好處:

1. 二階微分關心的是圖像灰度的突變而不強調灰度緩慢變化的區域,對邊緣的定位能力更強。

2. Laplace算子是各項同性的,即具有旋轉不變性(后面會證明),在一階微分里,我們是用|dx|+|dy|來近似一個點的梯度的,當圖像旋轉一個角度時,這個值就變化了,但對於Laplace算子來說不管圖像怎么旋轉,得到的響應是一樣的。

一個注意點:

我們檢測的必須是“過零點“,而不單單是零點,也就是要保證這個被選中的點一定要是局部極值點。比如下面這個例子,上面的曲線是圖像空間,虛線處的點並不是圖像的局部極值點,但求二階導的時候確實是零點。再比如圖像灰度的平坦區域,不管是一階導還是二階導都是0,它們顯然不是我們要的點:

461cdfd7b4c71274fe893b5f171efcf5.png

過零點的確定:

以p為中心的一個3*3領域,p點為過零點意味着至少有兩個相對的領域像素的符號不同。有四種要檢測的情況:左/右、上/下,和兩個對角。如果g(x,y)的值與一個閾值比較(一種通用的方法),那么不僅要求相對領域的符號不同,數值差的絕對值要超過這個閾值,這時p稱為一個過零點像素。

Laplace算子

09d3d5f4e21487dfb171b722b321878b.png

Laplace算子是梯度的散度 :

4c82a8b4b3abf78e62f52bf2704bf317.gif

577a6b758984fa19b652042752464dd7.png

圖像是離散的二維矩陣,用差分近似微分:

34e702cd1479f8398ff0ccb5b68113ca.gif

所以,

e3426187c9438145cdd566b7469e7e4b.gif

模板表示為:                                              其他常用的模板還有:

1f8ffa18974badd93235ccaa07cf2c98.png                                                                   

751c5418044f97907c179cd4c2ce54d3.gif                          

e0ed19419e94004e1d64b78ccacc628f.gif

Laplace算子的旋轉不變性證明如下:

fc82b36c829ba4b7f247473d086e40ea.png

兩個缺點:

1.沒有了邊緣的方向信息;

2.雙倍加強了噪聲的影響。

在Matlab中的測試結果:

原圖:

3b856297e3480933620311f7cec5972a.png

原圖在不同閾值下的邊緣檢測效果:

9525cdb20832f341f95f59d02d007fc8.png

加了椒鹽噪聲之后:

72e5845e3157261e0755b41ad91f73b4.png

加了高斯噪聲之后:

e8865fa3e370f08437c404fb5b07052d.png

代碼:

lenna = imread('E:\ImageTest\512\g512_006\lena.pgm');

%---------------------------------------------------------------------------

lenna_3=mat2gray(lenna); %圖像矩陣的歸一化

[m,n]=size(lenna_3);

lenna_4=lenna_3; %保留圖像的邊緣一個像素

L=0;

t=0.2; %設定閾值

%Laplace算子

for j=2:m-1

for k=2:n-1

L=abs(4*lenna_3(j,k)-lenna_3(j-1,k)-lenna_3(j+1,k)-lenna_3(j,k+1)-lenna_3(j,k-1));

if(L > t)

lenna_4(j,k)=255; %白

else

lenna_4(j,k)=0; %黑

end

end

end

figure;

imshow(lenna_4,[]);title('Laplacian 0.2')

可以明顯的看出,Laplace算子雖然解決了一階微分算子確定閾值的困難,但是卻不能克服噪聲的干擾。

於是LoG算子橫空出世。

LOG算子

1980年,Marr和Hildreth提出將Laplace算子與高斯低通濾波相結合,提出了LOG(Laplace and Guassian)算子。 步驟如下:

1.對圖像先進性高斯濾波(G

b63727d3a1772313d2c5572262198128.gif × f),再進行Laplace算子運算Δ(G

b63727d3a1772313d2c5572262198128.gif × f);

2.保留一階導數峰值的位置,從中尋找Laplace過零點;

3.對過零點的精確位置進行插值估計。

66e4a549a788c380c96d4b44838a9016.png

由上圖可以看出,高斯濾波之后邊緣信息才顯現出來。

d3fe6a9e2b6d80bd185d042a87e33e3d.gif

59bba3413938995ae91a18e98430c120.gif  微分算子與卷積算子的次序可以交換。

LOG算子如下:

b444e56f8057fa565ca3e3fee0b6bbef.png

根據sigma的不同以及3sigma原則可以建立不同的模板,sigma是一個尺度參數,在圖像處理中引入尺度以及建立多尺度空間是一個重要的突破,sigma越大,圖像越模糊濾除噪聲效果越好,sigma越小,效果相反。

常用模板如下:

05ff230a23df64aa7ab81e8667f340f0.gif

LOG的Matlab效果:

86b4940c3c5e78466783d338ebce60cc.png

lenna = imread('E:\ImageTest\512\g512_006\lena.pgm');

subplot(121)

imshow(lenna,[]);title('原圖')

%-------------------------------------------------------------

%自帶函數

lenna=double(lenna);

lenna_1 = edge(lenna,'log');

subplot(122)

imshow(lenna_1,[]);title('LoG 0.5')

由數學上的關系,我們可以簡化LOG的計算——這便是DOG算子。

DOG算子

二維高斯對sigma求導:

9a19e612d8c127086902739e79d28ed6.png

上面我們已經得到:

d759c98969f7a23e462e36c11f8ea960.png

可以看出:

cb6e1ad09d1d0552cef5b16bfae5e594.png

由導數定義:

bf7d5b7ade8f1e83f38d95748bd320e2.png

所以,

290ced91a870ddb752184d51e61e15c1.png

變形一下得到:

66ee6616b1682c41527f977026685496.png

右邊比LOG算子只是多了一個系數,在實際應用中不影響。

我們定義:

94a93018671a749f71a26b636b12bbbf.gif

當我們用DOG算子代替LOG算子與圖像卷積的時候:

ffd66ca27d78961793a1a2798783382e.png

近似的LOG算子

b63727d3a1772313d2c5572262198128.gif值的選取:

b30281b988bd0497e8e862f9863522bb.gif

當使用這個值時,可以保證LoG和DoG的過零點相同,只是幅度大小不同。

這樣,我們只要對圖像進行兩次高斯平滑再將結果相減就可以近似得到LOG作用於圖像的效果了!

DOG的matlab效果:

9c07c2b89a747e90fb3f363c7aee216e.png

这篇关于dog算子处理图片边界matlab代码,圖像邊緣檢測——二階微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab實現)...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/180390

相关文章

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取