日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Opencv笔记(十三)——图像的梯度

發布時間:2025/3/17 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Opencv笔记(十三)——图像的梯度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目標

  • 認識圖像梯度、邊界
  • 學習函數cv2.Sobel(),cv2.Schar(),cv2.Laplacian()

原理

? 圖像梯度可以把圖像看成二維離散函數,圖像梯度其實就是這個二維離散函數的求導。OpenCV提供三種類型的梯度濾波器或高通濾波器,Sobel,Scharr和Laplacian.

Sobel 和 Scharr 算子

Sobel算子是結合了高斯平滑與微分運算的結合方法,所以它的抗噪聲能力很強,其是普通一階差分,是基于尋找梯度強度。每一個算子分別對應這x和y這兩個方向的模板,故在代碼中要分別在兩個方向上處理,最后用cv2.addWeighted(...)函數將其組合起來。

Sobel算子

Sobel函數原型如下:

cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

前四個是必須的參數:

  • 第一個參數是需要處理的圖像;
  • 第二個參數是圖像的深度(數據類型),-1表示采用的是與原圖像相同的深度。目標圖像的深度必須大于等于原圖像的深度;
  • dx和dy表示的是求導的階數,0表示這個方向上沒有求導,一般為0、1、2;

其后是可選的參數:

  • ksize是Sobel算子的大小,必須為1、3、5、7。如果ksize=-1,那么一個3*3的scharr濾波器會被使用;
  • delta是一個可選的增量,將會加到最終的dst中,同樣,默認情況下沒有額外的值加到dst中;
  • borderType是判斷圖像邊界的模式。這個參數默認值為cv2.BORDER_DEFAULT;

Laplacian算子

拉普拉斯算子是常用的邊緣檢測算子,它是各向同性的二階導數。

計算公式卷積核

代碼實踐

Sobel算子:

# coding=utf-8 import cv2 import numpy as npimg = cv2.imread("/home/wl/1.jpg", 0)x = cv2.Sobel(img, cv2.CV_16S, 1, 0) y = cv2.Sobel(img, cv2.CV_16S, 0, 1)absX = cv2.convertScaleAbs(x) # 轉回uint8 absY = cv2.convertScaleAbs(y)dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)while(1):cv2.imshow("absX", absX)cv2.imshow("absY", absY)cv2.imshow("Result", dst)k = cv2.waitKey(1) & 0XFFif k==ord('q'):break; cv2.destroyAllWindows()

原圖:

效果圖:

Laplacian算子:

# coding=utf-8 import cv2 import numpy as npimg = cv2.imread("/home/wl/1.jpg", 0) laplacian=cv2.Laplacian(img,cv2.CV_64F) dst = cv2.convertScaleAbs(laplacian) #轉回uint8 while(1):cv2.imshow("Result",dst)k = cv2.waitKey(1) & 0XFFif k==ord('q'):break; cv2.destroyAllWindows()

效果圖:

注意點

?? 代碼看了的話,會發現我們的sobel函數的第二個參數(數據類型)會換成cv2.CV_16S或cv2.CV_64F,最后再變回uint8。這是因為從黑到白的邊界點的導數是正數,而從白到黑是負數,如果還是使用uint8,那么所有的負數都會變為0,即被截斷。

轉載于:https://www.cnblogs.com/longwhite/p/10397752.html

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的Opencv笔记(十三)——图像的梯度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。