OpenCV Laplace Operator

2021-02-19 17:03 更新

目標(biāo)

在本教程中,您將學(xué)習(xí)如何:

  • 使用OpenCV函數(shù)cv :: Laplacian來實(shí)現(xiàn)Laplace運(yùn)算符的離散模擬。

理論

  • 在上一個教程中,我們學(xué)習(xí)了如何使用Sobel操作符。這是基于以下事實(shí):在邊緣區(qū)域中,像素強(qiáng)度顯示“跳躍”或強(qiáng)度的高變化。得到強(qiáng)度的一階導(dǎo)數(shù),我們觀察到邊緣的特征是最大值,如圖所示:

Laplace Operator

  • 和...如果我們采取二階導(dǎo)數(shù)會發(fā)生什么?

Laplace Operator

您可以觀察到二階導(dǎo)數(shù)為零!因此,我們也可以使用此標(biāo)準(zhǔn)來嘗試檢測圖像中的邊緣。然而,請注意,零不僅會出現(xiàn)在邊緣(它們實(shí)際上可以出現(xiàn)在其他無意義的位置); 這可以通過在需要時應(yīng)用過濾來解決。

Laplace Operator

  • 從上面的解釋,我們推導(dǎo)出二階導(dǎo)數(shù)可以用來檢測邊緣。由于圖像是“* 2D *”,所以我們需要在兩個維度上使用導(dǎo)數(shù)。在這里,Laplace Operator很方便。
  • Laplace Operator被定義為:

Laplace Operator算法

  • 拉普拉斯運(yùn)算符通過函數(shù)cv :: Laplacian在OpenCV中實(shí)現(xiàn)。事實(shí)上,由于拉普拉斯算子使用圖像的梯度,所以它在內(nèi)部調(diào)用Sobel算子來執(zhí)行其計算。

Code

  • 這個程序是做什么的?
  1. 加載圖像
  2. 通過應(yīng)用高斯模糊來消除噪點(diǎn),然后將原始圖像轉(zhuǎn)換為灰度
  3. 將Laplace Operator應(yīng)用于灰度圖像并存儲輸出圖像
  4. 在窗口中顯示結(jié)果
  • 教程代碼如下所示。您也可以從這里下載
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
int main( int argc, char** argv )
{
  Mat src, src_gray, dst;
  int kernel_size = 3;
  int scale = 1;
  int delta = 0;
  int ddepth = CV_16S;
  const char* window_name = "Laplace Demo";
  String imageName("../data/lena.jpg"); // by default
  if (argc > 1)
  {
    imageName = argv[1];
  }
  src = imread( imageName, IMREAD_COLOR ); // Load an image
  if( src.empty() )
    { return -1; }
  GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
  cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to grayscale
  Mat abs_dst;
  Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
  convertScaleAbs( dst, abs_dst );
  imshow( window_name, abs_dst );
  waitKey(0);
  return 0;
}

說明

  • 創(chuàng)建一些必需的變量:
  Mat src,src_gray,dst;
  int kernel_size = 3;
  int scale = 1;
  int delta = 0;
  int ddepth = CV_16S ;
  const  char * window_name = “Laplace Demo” ;
  • 加載源圖像:
  String imageName("../data/lena.jpg"); // by default
  if (argc > 1)
  {
    imageName = argv[1];
  }
  src = imread( imageName, IMREAD_COLOR ); // Load an image
  if( src.empty() )
    { return -1; }
  • 應(yīng)用高斯模糊來減少噪音:
  GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
  cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to grayscale
  • 將Laplace Operator應(yīng)用到灰度圖像中:
  Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );

其中的論點(diǎn)是:

  1. src_gray:輸入圖像。
  2. dst:目的地(輸出)圖像
  3. ddepth:目的地圖像的深度。由于我們的輸入是CV_8U,我們定義ddepth = CV_16S以避免溢出
  4. kernel_size:內(nèi)部應(yīng)用的Sobel運(yùn)算符的內(nèi)核大小。我們在這個例子中使用3。
  5. 縮放,增量和BORDER_DEFAULT:我們將它們保留為默認(rèn)值。
  • 將Laplace Operator的輸出轉(zhuǎn)換為CV_8U圖像:
  convertScaleAbs(dst,abs_dst);
  • 在窗口中顯示結(jié)果:
  imshow(window_name,abs_dst);
  waitKey(0);

結(jié)果

  • 在編譯上面的代碼之后,我們可以運(yùn)行它作為參數(shù)作為圖像的路徑。例如,使用作為輸入:

Laplace Operator

  • 我們得到以下結(jié)果。請注意,如何將樹木和牛仔的輪廓定義得很好(除了強(qiáng)度非常相似的區(qū)域,即在牛頭頂部)。另外,請注意,樹木后面的屋頂(右側(cè))是臭名昭著的。這是因?yàn)樵摰貐^(qū)的對比度較高。

Laplace Operator

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號