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

相关文章

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型