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 FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN