1. 程式人生 > >LOG邊緣檢測--Marr-Hildreth邊緣檢測演算法

LOG邊緣檢測--Marr-Hildreth邊緣檢測演算法

邊緣檢測的改進:

一、邊緣檢測方法是以使用較小的算則為基礎的,

Marr和Hildreth證明了:(1)灰度變化與影象尺寸無關,因此他們的檢測要求使用不同尺寸的運算元;

(2)灰度的突然變化會在一階導數中引起波峰或波谷,或在二階導數中等效地引起零交叉。

根據這些建議,邊緣檢測運算元應有兩個顯著特點:

(1)能計算影象中每一點處的一階導數或二階導數的數字近似的微分運算元;

(2)能被“調整”以便在任何期望的尺寸上起作用。

因此,大的運算元可用與檢測模糊邊緣,小的運算元可用於檢測銳度集中得到精細細節。

二、Marr和Hildreth論證過,滿足這些條件最令人滿意得到運算元是濾波器,是拉普拉斯運算元,

而G是標準差為(有時也稱為空間常數)的二維高斯函式:

.

經過計算

稱為高斯拉普拉斯(LoG).

LoG的零交叉出現在處,它定義了一箇中心位於原點,

半徑為的圓

LoG函式有時也稱為墨西哥草帽運算元。一個正的中心項由緊鄰的負區域包圍著,中心項的值以距原點的距離為函式而增大,

而外層區域的值零。係數之和必須為零,從而模板的響應在恆定灰度區域為零。

三、形狀為5*5模板的近似,實際中將使用該模板的負值:


任意尺寸的模板可以通過式子取樣,並標定係數以使係數之和為零來生成。

生成LoG濾波器的一種更有效的方法是以希望的n*n尺寸對式取樣,然後將結果陣列與一個拉普拉斯模板進行卷積。

因為用一個係數之和為零的模板對影象陣列卷積產生一個元素之和也為零的結果,故這種方法自動滿足LoG濾波器係數之和為零的要求。

四、選擇運算元的基礎:

(1)運算元的高斯部分會模糊影象,從而在尺寸上將結構的灰度(包括噪聲)降低到遠小於的程度。

和均值濾波器平滑相比,高斯函式在空間和頻率兩個域平滑影象,因而在原影象中引入不存在的人為干擾(如振鈴)的可能性小。

(2)濾波器的二階部分。

儘管一階導數用於檢測灰度突變,但它們是有方向的運算元。另一方面,拉普拉斯有各項同性(旋轉不變性)。

對任何模板方向的灰度變化有相等的響應,從而避免了使用多個模板去計算影象中任何點處的最強響應。

五、Marr-Hildreth演算法由LOG濾波器與一幅輸入影象f(x,y)卷積組成,即:


然後尋找g(x,y)的零交叉來確定f(x,y)中邊緣的位置。

因為這些都是線性操作,故上市也可改下為:


它指出,我們可以先使用一個高斯濾波器平滑影象,然後計算該結果的拉普拉斯。這兩個公式給出了相同的結果。

六、總結

Marr-Hildreth邊緣檢測演算法如下:

1.用一個對 取樣的n*n的高斯低通濾波器對輸入影象濾波。

2.計算由第一步得到的影象的拉普拉斯,如模板


3.找到步驟2所得影象的零交叉。

為確定高斯濾波器的大小,仍採用位於二維高斯表面下其均值在3之間的99.7%。

這樣,一個大小為n*n的LoG離散濾波器,其n值應是大於等於6的最小奇整數。

n小於該值的濾波器模板會“截斷”LoG函式,截斷的程度與模板的大小成反比;

而使用較大的模板對結果的影響不大。

零交叉點的確定:

以P為中心的一個3*3領域,p點處的零交叉意味著至少有兩個相對的領域畫素的符號不同。

有四種要測試的情況:左/右、上/下,和兩個對角。如果g(x,y)的值與一個閾值比較(一種通用的方法),

那麼不僅相對領域的符號不同,數值差的絕對值不能超過這個閾值,這時p稱為一個零交叉畫素。

零交叉是Marr-Hiltreth邊緣檢測方法的關鍵特徵。

此外,Huertas and Medioni提出採用亞畫素精度來尋找零交叉的方法。

設定閾值,可檢測出大多數的主要邊緣,並且濾掉一些“無關”特徵,使用零交叉檢測邊緣可得到一個畫素寬的邊緣。

這一特性簡化了諸如邊緣連線的後續階段的處理。

考慮到灰度變化取決於數值範圍的試試,有時使用各種值來對一幅影象進行濾波。然後,所得零交叉邊緣圖與僅為全部圖形保留的公共邊緣相結合。

這種方法可得到很有用的資訊,但由於其複雜性,實踐中多被用於使用單一濾波器選擇合適的值的設計工具。


使用高斯差分(DoG)來近似LoG是可能的:

視覺系統中,某些“通道”就方向和頻率而論,是有選擇性的。且可以使用:

以1.75:1的標準差比率來建模。

使用1.6:1的比率不僅可以保持這些觀察的基本特性,且可以對LoG提供一個更接近的“工程”近似。

為在LoG和DoG之間進行有意義的比較,對於LOG,值必須按照如下公式選擇,以便LoG和DoG具有相同的零交叉;


當使用這個值時,儘管LoG和DoG的零交叉相同,但它們的幅度大小會不同。可通過標定使得他們相容,以便他們在原點處有相同的值。

LoG和DoG濾波操作均可直接使用一維卷積代替二維卷積來實現,對於一幅大學為M*N的影象和一個大小為n*n的濾波器,這樣做可將每次卷積所需的乘法和加法次數,

從二維卷積的n*nMN成正比,減少到一維卷積的n*MN成正比。

#include <iostream>
#include "cv.h" 
#include "highgui.h"
#include "opencv2/imgproc/imgproc.hpp"

using namespace std;
using namespace cv;

#ifdef _DEBUG
#pragma comment(lib,"opencv_core2413d.lib")
#pragma comment(lib,"opencv_imgproc2413d.lib")
#pragma comment(lib,"opencv_highgui2413d.lib")

#else
#pragma comment(lib,"opencv_core2413.lib")
#pragma comment(lib,"opencv_imgproc2413.lib")
#pragma comment(lib,"opencv_highgui2413.lib")

#endif


int main(int argc, char *argv[])
{

	// Read image
	Mat src = imread("Fig0222(a)(face).tif", CV_LOAD_IMAGE_COLOR);
	if (!src.data) {
		cout << "Error: read image" << endl;
		return -1;
	}
	cvtColor(src, src, CV_RGB2GRAY);
	namedWindow("Origin", CV_WINDOW_AUTOSIZE);
	imshow("Origin", src);

	Mat dst,dst1,dst2;
	// CV_EXPORTS_W void Laplacian( InputArray src, OutputArray dst, int ddepth,
	//                          int ksize=1, double scale=1, double delta=0,
	//                          int borderType=BORDER_DEFAULT );
	Laplacian(src, dst1, src.depth(), 3, 1, 0, BORDER_DEFAULT);
	GaussianBlur(src, src, Size(3, 3), 1.5, 1.5);
	Laplacian(src, dst, src.depth(), 3, 1, 0, BORDER_DEFAULT);
	GaussianBlur(dst, dst2, Size(3, 3), 1.5, 1.5);
	namedWindow("Laplacian", CV_WINDOW_AUTOSIZE);
	imshow("GaussianLalacian", dst);
	imshow("Laplacian", dst1);
	imshow("LaplacianGaussian", dst2);
	waitKey();

	return 0;
}


效果圖

參考文獻:《數字影象處理》(第三版)岡薩雷斯


相關推薦

LOG邊緣檢測--Marr-Hildreth邊緣檢測演算法

邊緣檢測的改進: 一、邊緣檢測方法是以使用較小的算則為基礎的, Marr和Hildreth證明了:(1)灰度變化與影象尺寸無關,因此他們的檢測要求使用不同尺寸的運算元; (2)灰度的突然變化會在一階導數中引起波峰或波谷,或在二階導數中等效地引起零交叉。 根據這些建議,邊緣

Marr-Hildreth邊緣檢測器

用於邊緣檢測的運算元應該有兩個顯著的特點: 1.它應該能夠計算圖中每一個點處的一階導數或者二階導數的數字近似的微分運算元。 2.它能夠被“調整”以便在任何期望的尺寸上其作用。因此,大的運算元也可以用於檢測模糊邊緣,小的運算元可以用來檢測銳度集中的精細細節。 滿足

Marr-Hildreth邊緣檢測器C++實現

Marr-Hiddreth是基於以下兩個事實的: 1 灰度變換與影象尺寸無關,因此邊緣檢測可以使用不同的尺寸運算元 2 灰度的突然變換會在一階導數中導致波峰或波谷,或在二階導數中等效的引起零交叉 用於邊緣檢測的運算元應該有兩個明顯的特點: 1 它應該是一個

7.邊緣檢測:2D運算——Canny邊緣原理、Canny邊緣檢測器、Canny-Matlab實戰_2

目錄 Canny邊緣原理 Canny邊緣檢測器 Canny-Matlab實戰 Canny邊緣原理 既然我們知道了如何計算光滑導數和梯度,我們就可以回到如何找到邊的問題上。 基本上這是一個多步驟的過程,對吧? 1.你要建立平滑的導數來抑制一些噪聲我們要計算一些主要的梯度

邊緣視訊二維碼檢測助手V1.2的功能介紹

邊緣視訊二維碼檢測助手V1.2的功能介紹 其功能是可以批量檢查視訊中有沒有存在二維碼,哪怕是一閃而過的二維碼也可以很好的檢測出來。   我們知道,無論發視訊到哪個平臺,如果遇到視訊中有二維碼出現的話,平臺都會封號或者扣分。而人工去檢查的話,只能是把整個視訊認真的完整看一遍,這樣的話

利用Canny邊緣檢測運算元進行邊緣檢測的原理及OpenCV程式碼實現

Canny運算元是John Canny在1986年發表的論文中首次提出的邊緣檢測運算元,該運算元檢測效能比較好,應用廣泛。 Canny運算元進行邊緣檢測的原理和步驟如下: ⑴消除噪聲。邊緣檢測的演算法主要是基於影象強度的一階和二階微分操作,但導數通常對噪聲很敏感,邊緣檢測

虹膜識別(三):Hough變換檢測內圓邊緣

前面我們已經得到了hough變換的基礎條件,那就是有一個很好的用於檢測的二值邊緣影象如下所示:   至此我們才能運用hough變換。 Hough變換是一類廣泛用於檢測各種規則圖形用的,像直線、圓、橢圓等等,不同的就是檢測的規律不同。Hough變換的原理網上多得是,像http

OpenCV使用Canny邊緣檢測器實現影象邊緣檢測

效果圖 原始碼 Canny邊緣檢測器是一種被廣泛使用的演算法,並被認為是邊緣檢測最優的演算法,該方法使用了比高斯差分演算法更復雜的技巧,如多向灰度梯度和滯後閾值化。 Canny

【影象處理】Sobel運算元實現水平邊緣檢測、垂直邊緣檢測;45度、135度角邊緣檢測

%File Discription: %45°和135°角邊緣檢測;用於那些邊界不明顯的圖片 %不太適用於複雜圖,複雜圖用水平和垂直邊緣檢測 %Author:Zhang Ruiqing %CreateTime:2011.8.8(What a good day!(*^__^*)

特徵提取與檢測(二) --- SIFT演算法

        SIFT(Scale-invariant feature transform)是一種檢測區域性特徵的演算法,該演算法通過求一幅圖中的特徵點(interest points,or corner points)及其有關scale 和 orien

[原始碼和文件分享]基於過載演算法的記憶體洩漏檢測和記憶體越界檢測

通過過載`new`,`delete`實現對在動態記憶體分配中記憶體越界和記憶體洩露的自動檢測 1. 記憶體洩漏 1.1 簡介 `記憶體洩漏`是當程式不正確地進行記憶體管理時出現的一種資源洩漏,表現為程式不再需要使用的記憶體空間並沒有及時被釋放掉。記憶體洩漏並非指實體記憶體的消失,而是在程

物件檢測(object detection)演算法圖解

摘要: 本文簡要介紹影象檢測中常用的深度學習方法——RCNN家族系列演算法,以影象講解形式,便於理解。        在生活中,經常會遇到這樣的一種情況,上班要出門的時候,突然找不到一件東西了,比如鑰匙、手機或者手錶等。這個時候一般在房間翻一遍各個角落來尋找

目標檢測(一)--Objectness演算法總體理解,整理及總結

1.原始碼下載及轉換為VS2012 WIN32版本。 http://www.cnblogs.com/larch18/p/4560690.html 2.原文: http://wenku.baidu.com/link?url=ls5vmcYnsUdC-ynKdBzWgx

目標檢測之SSD:RefineNet演算法理解

RefineDet是CVPR2018的論文,個人覺得是一篇很不錯的文章,大致上是SSD演算法和RPN網路、FPN演算法的結合,可以在保持SSD高效的前提下提高檢測效果(實驗效果提升挺明顯)。第一眼看到這篇文章就讓我想起了RON,畢竟都是想做one stage和two stag

目標檢測中的Anchor Box演算法

引入 無論是基於滑動視窗,還是基於網格YOLO的目標檢測演算法,都有可能存在同一個問題:有可能一個BOX中有多個目標,如下圖所示: 這樣的圖中,行人和車同時存在,並且他們的中心位置都位於同一個網格中。這種情況下,傳統檢測方法的輸出,就無法勝任了。怎麼解決這個問

CVPR2018 目標檢測(object detection)演算法總覽

CVPR2018上關於目標檢測(object detection)的論文比去年要多很多,而且大部分都有亮點。從其中挑了幾篇非常有意思的文章,特來分享,每篇文章都有詳細的部落格筆記,可以點選連結閱讀。 Cascaded RCNN這篇文章的出發點非常有意思,是

ECCV2018目標檢測(object detection)演算法總覽

這篇部落格記錄我個人比較感興趣的ECCV2018關於目標檢測(object detection)的一些文章。 1、IOU-Net 論文:Acquisition of Localization Confidence for Accurate Object Dete

OPENCV的學習:影象特徵檢測之Harris角點演算法

    影象檢測是影象分割,影象識別的基礎,也是不可缺少的關鍵。在視覺計算理論框架中,抽取二維影象的邊緣、角點、紋理等基本特徵,是整個框架的第一步;本文章對Harris角點演算法做了比較詳細的理論介紹以及相關實現。 Part One:角點型別介紹 在現實世界中,角點

【特徵檢測】ORB特徵提取演算法

簡介         ORB的全稱是ORiented Brief,是文章ORB: an efficient alternative to SIFT or SURF中提出的一種新的角點檢測與特徵描述演算

目標檢測:fasterRCNN和RFCN演算法的理解

所有的two-stage detection 演算法大致都由兩部分組成:RPN生成proposal和對proposal的cls和reg。本科做畢設用了Faster RCNN,對此類演算法稍稍有點了解,但是還是很多迷惑。最近本人認真研讀了light head rcnn,對two