1. 程式人生 > >【OpenCV】邊緣檢測:Sobel、拉普拉斯運算元

【OpenCV】邊緣檢測:Sobel、拉普拉斯運算元

邊緣

邊緣(edge)是指影象區域性強度變化最顯著的部分。主要存在於目標與目標、目標與背景、區域與區域(包括不同色彩)之間,是影象分割、紋理特徵和形狀特徵等影象分析的重要基礎。

影象強度的顯著變化可分為:

  • 階躍變化函式,即影象強度在不連續處的兩邊的畫素灰度值有著顯著的差異;
  • 線條(屋頂)變化函式,即影象強度突然從一個值變化到另一個值,保持一較小行程後又回到原來的值。

影象的邊緣有方向和幅度兩個屬性,沿邊緣方向畫素變化平緩,垂直於邊緣方向畫素變化劇烈.邊緣上的這種變化可以用微分運算元檢測出來,通常用一階或二階導數來檢測邊緣。

(a)(b)分別是階躍函式和屋頂函式的二維影象;(c)(d)是階躍和屋頂函式的函式圖象;(e)(f)對應一階倒數;(g)(h)是二階倒數。

一階導數法:梯度運算元

對於左圖,左側的邊是正的(由暗到亮),右側的邊是負的(由亮到暗)。對於右圖,結論相反。常數部分為零。用來檢測邊是否存在。

梯度運算元 Gradient operators

函式f(x,y)在(x,y)處的梯度為一個向量:

計算這個向量的大小為:

近似為:

梯度的方向角為:

Sobel運算元

sobel運算元的表示:

梯度幅值:

用卷積模板來實現:

【相關程式碼】

介面

CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth,
                         int dx, int dy, int ksize=3,
                         double scale=1, double delta=0,
                         int borderType=BORDER_DEFAULT );

使用

  /////////////////////////// Sobe l////////////////////////////////////
  /// Generate grad_x and grad_y
  Mat grad_x, grad_y;
  Mat abs_grad_x, abs_grad_y;
  /// Gradient X
  //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
  //Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator.
  Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );   
  convertScaleAbs( grad_x, abs_grad_x );
  /// Gradient Y  
  //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
  Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );   
  convertScaleAbs( grad_y, abs_grad_y );
  /// Total Gradient (approximate)
  addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );


二階微分法:拉普拉斯

二階微分在亮的一邊是負的,在暗的一邊是正的。常數部分為零。可以用來確定邊的準確位置,以及畫素在亮的一側還是暗的一側。


LapLace 拉普拉斯運算元

二維函式f(x,y)的拉普拉斯是一個二階的微分,定義為:

其中:

可以用多種方式將其表示為數字形式。對於一個3*3的區域,經驗上被推薦最多的形式是:

定義數字形式的拉普拉斯要求係數之和必為0

【相關程式碼】

介面

CV_EXPORTS_W void Laplacian( InputArray src, OutputArray dst, int ddepth,
                             int ksize=1, double scale=1, double delta=0,
                             int borderType=BORDER_DEFAULT );

使用

Mat abs_dst,dst;
  int scale = 1;
  int delta = 0;
  int ddepth = CV_16S;
  int kernel_size = 3; 
  Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
  convertScaleAbs( dst, abs_dst );
  namedWindow( window_name2, CV_WINDOW_AUTOSIZE );


實踐效果

原圖

Sobel 邊緣檢測

Sobel運算元可以直接計算Gx 、Gy可以檢測到邊的存在,以及從暗到亮,從亮到暗的變化。僅計算| Gx |,產生最強的響應是正交 於x軸的邊; | Gy |則是正交於y軸的邊。

Laplace邊緣檢測

拉普拉斯對噪聲敏感,會產生雙邊效果。不能檢測出邊的方向。通常不直接用於邊的檢測,只起輔助的角色,檢測一個畫素是在邊的亮的一邊還是暗的一邊利用零跨越,確定邊的位置。

相關推薦

OpenCV邊緣檢測Sobel拉普拉斯運算元

邊緣 邊緣(edge)是指影象區域性強度變化最顯著的部分。主要存在於目標與目標、目標與背景、區域與區域(包括不同色彩)之間,是影象分割、紋理特徵和形狀特徵等影象分析的重要基礎。 影象強度的顯著變化可分為: 階躍變化函式,即影象強度在不連續處的兩邊的畫素灰度值有著顯著的差異;

Python OpenCV _5邊緣檢測Sobel運算元,Laplacian運算元,Canny運算元)

Python OpenCV這個初級影象處理系列是參考他人的文章寫的,有些地方做了一些改動,沒有太多理論,側重程式碼實現,主要目的是將這些基本操作程式碼系統地梳理一遍,也是為了以後能快速查詢。 此係列原始碼在我的GitHub裡:https://github.com/yeyujujishou19/P

深度學習50物體檢測SSD: Single Shot MultiBox Detector論文翻譯

SSD在眾多的物體檢測方法中算是比較重要的。之前學習過,但是沒過多久就忘了,因此決定將該論文翻譯一下,以加深印象。 Abstract 我們提出了用單個深度神經網路進行物體檢測的方法,稱為SSD。在每個特徵圖中的每個位置,SSD將bbox(bounding

深度學習17物體檢測Focal Loss 反向求導及darknet上的實現

Focal Loss 反向求導及darknet上的實現 Focal Loss 可以解決不平衡分類問題,是在交叉熵損失函式上的擴充套件。詳見,論文:Focal Loss for Dense Object Detection。 該文,主要推導FL在softmax

opencv矩形檢測

#include "cv.h" #include "highgui.h" #include <stdio.h> #include <math.h> #include <string.h> /////////////////

opencv多邊形檢測

示例程式碼為7邊形,直接改巨集定義即可 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <math.h> #include &

OpenCV影象變換(二)邊緣檢測梯度運算元Sobel運算元和Laplace運算元

邊緣 邊緣(edge)是指影象區域性強度變化最顯著的部分。主要存在於目標與目標、目標與背景、區域與區域(包括不同色彩)之間,是影象分割、紋理特徵和形狀特徵等影象分析的重要基礎。 影象強度的顯著變化可分為: •階躍變化函式,即影象強度在不連續處的兩邊的畫

OpenCV探索之路(六)邊緣檢測(cannysobellaplacian)

邊緣檢測的一般步驟: 濾波——消除噪聲 增強——使邊界輪廓更加明顯 檢測——選出邊緣點 Canny演算法 Canny邊緣檢測演算法被很多人推崇為當今最優秀的邊緣檢測演算法,所以我們第一個就介紹他。 opencv中提供了Canny函式。 #include<

OpenCV——邊緣檢測sobel算子Laplacian算子scharr濾波器)

scale 變換 得到 疊加 操作 fault sch laplacian 技術 1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using nam

梯度與邊緣檢測常用運算元RobertsPrewittSobelLapacian運算元

原文;https://blog.csdn.net/swj110119/article/details/51777422 一、學習心得: 學習影象處理的過程中,剛開始遇到影象梯度和一些運算元的概念,這兩者到底是什麼關係,又有什麼不同,一直困擾著我。後來在看到影象分

OpenCV實戰(一): SobelLaplacianCanny 邊緣檢測

簡述 OpenCV邊緣檢測的一般步驟為: 濾波 增強 檢測 常用的邊緣檢測的運算元和濾波器有: Sobel運算元 Laplacian運算元 Canny運算元 Scharr濾波器 以下使用Sobel、Laplacian和Canny運算元進行邊緣檢測。圖片是從網上

OpenCV實戰(一): SobelLaplacianCanny 邊緣檢測

watermark 邊緣檢測 char 方向梯度 濾波器 ima else term 51cto 簡述 OpenCV邊緣檢測的一般步驟為: 濾波 增強 檢測 常用的邊緣檢測的算子和濾波器有: Sobel算子 Laplacian算子 Canny算子 Scharr濾波器

OpenCV角點檢測Harris角點及Shi-Tomasi角點檢測

角點 特徵檢測與匹配是Computer Vision 應用總重要的一部分,這需要尋找影象之間的特徵建立對應關係。點,也就是影象中的特殊位置,是很常用的一類特徵,點的區域性特徵也可以叫做“關鍵特徵點”(keypoint feature),或“興趣點”(interest poi

OpenCVCanny 邊緣檢測

Canny 邊緣檢測演算法 1986年,JOHN CANNY 提出一個很好的邊緣檢測演算法,被稱為Canny編邊緣檢測器[1]。 Canny邊緣檢測根據對信噪比與定位乘積進行測度,得到最優化逼近運算元,也就是Canny運算元。類似與 LoG 邊緣檢測方法,也屬於先平滑後求導

OpenCVCanny邊緣檢測

五個步驟: 1.使用高斯濾波器對影象進行去噪 2.計算梯度 3.在邊緣上使用非最大抑制—NMS 4.在檢測道德邊緣上使用雙閾值去除假陽性 5.分析邊緣極其之間的連線,以保證保留真正的邊緣並消除不明顯的邊緣 import cv2 import nu

Android opencv(三) 邊緣檢測SobelCanny

Sobel Sobel是檢測邊緣的一階導數,在檢測邊緣前需要通過濾波(blur)去噪來使圖片光滑,一般使用高斯濾波,大小取7x7. //高斯濾波 public static Mat removeNoiseGaussianBlur(Mat sr

Java線程鎖機制synchronizedLockCondition轉載

留下 初始化 char 想要 interrupt 機制 運行 -m 特性 http://www.infoq.com/cn/articles/java-memory-model-5 深入理解Java內存模型(五)——鎖 http://www.ibm.com/develope

OpenCVMFC圖片視頻攝像頭輸入響應詳細圖解

tsp box 背景建模 img 有變 highgui 復制 creat int 記住新建項目後,要配置OpenCV環境!參考鏈接http://blog.csdn.net/zy122121cs/article/details/49180541 做工程搭建框架什麽的,基本的

OpenCV圖像增強---灰度變換直方圖均衡化

test 增強 映射 display 得到 .cpp scalar pic 重要 圖像增強的目的:改善圖像的視覺效果或使圖像更適合於人或機器的分析處理。通過圖像增強,可以減少圖像噪聲,提高目標與背景的對比度,也可以增強或抑制圖像中的某些細節。 -------------

mpich2圖文教程mpich2的安裝配置測試vs配置命令列測試(沒有使用)

轉載請註明出處,原文連結:https://blog.csdn.net/u013642500/article/details/83549093 【安裝mpich2】 1、開啟“mpich2-1.4.1p1-win-ia32.msi。 2、點選“Next”。 3、點選“N