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实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是