日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

OpenCV-Python教程(6)(7)(8): Sobel算子 Laplacian算子 Canny边缘检测

發布時間:2025/3/21 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV-Python教程(6)(7)(8): Sobel算子 Laplacian算子 Canny边缘检测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OpenCV-Python教程(6、Sobel算子)

本篇文章介紹如何用OpenCV-Python來使用Sobel算子。

提示:

  • 轉載請詳細注明原作者及出處,謝謝!
  • 本文介紹使用OpenCV-Python實現基本的濾波處理
  • 本文不介詳細的理論知識,讀者可從其他資料中獲取相應的背景知識。筆者推薦清華大學出版社的《圖像處理與計算機視覺算法及應用(第2版) 》。

Sobel算子

原型

Sobel算子依然是一種過濾器,只是其是帶有方向的。在OpenCV-Python中,使用Sobel的算子的函數原型如下:

[python]?view plaincopy
  • dst?=?cv2.Sobel(src,?ddepth,?dx,?dy[,?dst[,?ksize[,?scale[,?delta[,?borderType]]]]])??
  • 函數返回其處理結果。

    前四個是必須的參數:

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

    其后是可選的參數:

    • dst不用解釋了;
    • ksize是Sobel算子的大小,必須為1、3、5、7。
    • scale是縮放導數的比例常數,默認情況下沒有伸縮系數;
    • delta是一個可選的增量,將會加到最終的dst中,同樣,默認情況下沒有額外的值加到dst中;
    • borderType是判斷圖像邊界的模式。這個參數默認值為cv2.BORDER_DEFAULT

    使用

    在OpenCV-Python中,Sobel函數的使用如下:

    [python]?view plaincopy
  • #coding=utf-8??
  • import?cv2??
  • import?numpy?as?np????
  • ??
  • img?=?cv2.imread("D:/lion.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)??
  • ??
  • cv2.imshow("absX",?absX)??
  • cv2.imshow("absY",?absY)??
  • ??
  • cv2.imshow("Result",?dst)??
  • ??
  • cv2.waitKey(0)??
  • cv2.destroyAllWindows()???
  • 解釋

    在Sobel函數的第二個參數這里使用了cv2.CV_16S。因為OpenCV文檔中對Sobel算子的介紹中有這么一句:“in the case of 8-bit input images it will result in truncated derivatives”。即Sobel函數求完導數后會有負值,還有會大于255的值。而原圖像是uint8,即8位無符號數,所以Sobel建立的圖像位數不夠,會有截斷。因此要使用16位有符號的數據類型,即cv2.CV_16S。

    在經過處理后,別忘了用convertScaleAbs()函數將其轉回原來的uint8形式。否則將無法顯示圖像,而只是一副灰色的窗口。convertScaleAbs()的原型為:

    [python]?view plaincopy
  • dst?=?cv2.convertScaleAbs(src[,?dst[,?alpha[,?beta]]])??
  • 其中可選參數alpha是伸縮系數,beta是加到結果上的一個值。結果返回uint8類型的圖片。

    由于Sobel算子是在兩個方向計算的,最后還需要用cv2.addWeighted(...)函數將其組合起來。其函數原型為:

    [python]?view plaincopy
  • dst?=?cv2.addWeighted(src1,?alpha,?src2,?beta,?gamma[,?dst[,?dtype]])??
  • 其中alpha是第一幅圖片中元素的權重,beta是第二個的權重,gamma是加到最后結果上的一個值。

    結果

    原圖像為:

    結果為:


    參考資料:

    1、《Opencv2 Computer Vision Application Programming Cookbook》

    2、《OpenCV References Manule》




    OpenCV-Python教程(7、Laplacian算子)

    本篇文章介紹如何用OpenCV-Python來使用Laplacian算子。

    提示:

    • 轉載請詳細注明原作者及出處,謝謝!
    • 本文介紹使用在OpenCV-Python中使用Laplacian函數
    • 本文不介詳細的理論知識,讀者可從其他資料中獲取相應的背景知識。筆者推薦清華大學出版社的《圖像處理與計算機視覺算法及應用(第2版) 》。

    Laplacian算子

    圖像中的邊緣區域,像素值會發生“跳躍”,對這些像素求導,在其一階導數在邊緣位置為極值,這就是Sobel算子使用的原理——極值處就是邊緣。如下圖(下圖來自OpenCV官方文檔):


    如果對像素值求二階導數,會發現邊緣處的導數值為0。如下(下圖來自OpenCV官方文檔):


    Laplace函數實現的方法是先用Sobel 算子計算二階x和y導數,再求和:(CSDN,你打水印,讓我的公式怎么辦?)

    函數原型

    在OpenCV-Python中,Laplace算子的函數原型如下:

    [python]?view plaincopy
  • dst?=?cv2.Laplacian(src,?ddepth[,?dst[,?ksize[,?scale[,?delta[,?borderType]]]]])??
  • 如果看了上一篇Sobel算子的介紹,這里的參數應該不難理解。

    前兩個是必須的參數:

    • 第一個參數是需要處理的圖像;
    • 第二個參數是圖像的深度,-1表示采用的是與原圖像相同的深度。目標圖像的深度必須大于等于原圖像的深度;

    其后是可選的參數:

    • dst不用解釋了;
    • ksize是算子的大小,必須為1、3、5、7。默認為1。
    • scale是縮放導數的比例常數,默認情況下沒有伸縮系數;
    • delta是一個可選的增量,將會加到最終的dst中,同樣,默認情況下沒有額外的值加到dst中;
    • borderType是判斷圖像邊界的模式。這個參數默認值為cv2.BORDER_DEFAULT

    使用

    這里還是以Sobel一文中的石獅作為測試圖像,下面是測試代碼:

    [python]?view plaincopy
  • #coding=utf-8??
  • import?cv2??
  • import?numpy?as?np????
  • ??
  • img?=?cv2.imread("D:/lion.jpg",?0)??
  • ??
  • gray_lap?=?cv2.Laplacian(img,cv2.CV_16S,ksize?=?3)??
  • dst?=?cv2.convertScaleAbs(gray_lap)??
  • ??
  • cv2.imshow('laplacian',dst)??
  • cv2.waitKey(0)??
  • cv2.destroyAllWindows()??
  • 為了讓結果更清晰,這里的ksize設為3,效果圖如下:

    有點像粉筆畫,是吧。這是因為原圖像未經過去噪就直接處理了。可以通過濾波一文中,使用低通濾波一節中高斯模糊來先處理一下再用拉普拉斯函數。

    參考資料:

    1、《Opencv2 Computer Vision Application Programming Cookbook》

    2、《OpenCV References Manule》




    OpenCV-Python教程(8、Canny邊緣檢測Sobel算子)

    本篇文章介紹如何用OpenCV-Python來使用Canny算子。

    提示:

    • 轉載請詳細注明原作者及出處,謝謝!
    • 本文介紹使用OpenCV-Python實現基本的濾波處理
    • 本文不介詳細的理論知識,讀者可從其他資料中獲取相應的背景知識。筆者推薦清華大學出版社的《圖像處理與計算機視覺算法及應用(第2版) 》。

    原型

    OpenCV-Python中Canny函數的原型為:

    [python]?view plaincopy
  • edge?=?cv2.Canny(image,?threshold1,?threshold2[,?edges[,?apertureSize[,?L2gradient?]]])???
  • 必要參數:

    • 第一個參數是需要處理的原圖像,該圖像必須為單通道的灰度圖;
    • 第二個參數是閾值1;
    • 第三個參數是閾值2。

    其中較大的閾值2用于檢測圖像中明顯的邊緣,但一般情況下檢測的效果不會那么完美,邊緣檢測出來是斷斷續續的。所以這時候用較小的第一個閾值用于將這些間斷的邊緣連接起來。

    可選參數中apertureSize就是Sobel算子的大小。而L2gradient參數是一個布爾值,如果為真,則使用更精確的L2范數進行計算(即兩個方向的倒數的平方和再開放),否則使用L1范數(直接將兩個方向導數的絕對值相加)。

    具體的算法可參見清華大學出版社的《圖像處理與計算機視覺算法及應用(第2版) 》第二章,其中有Canny算法的詳細描述及實現。

    函數返回一副二值圖,其中包含檢測出的邊緣。

    使用

    Canny函數的使用很簡單,只需指定最大和最小閾值即可。如下:

    [python]?view plaincopy
  • #coding=utf-8??
  • import?cv2??
  • import?numpy?as?np????
  • ??
  • img?=?cv2.imread("D:/lion.jpg",?0)??
  • ??
  • img?=?cv2.GaussianBlur(img,(3,3),0)??
  • canny?=?cv2.Canny(img,?50,?150)??
  • ??
  • cv2.imshow('Canny',?canny)??
  • cv2.waitKey(0)??
  • cv2.destroyAllWindows()??
  • 首先,由于Canny只能處理灰度圖,所以將讀取的圖像轉成灰度圖。

    用高斯平滑處理原圖像降噪。

    調用Canny函數,指定最大和最小閾值,其中apertureSize默認為3。

    處理結果如下:

    更多

    這個程序只是靜態的,在github上有一個可以在運行時調整閾值大小的程序。其代碼如下:

    [python]?view plaincopy
  • import?cv2??
  • import?numpy?as?np??
  • ??
  • def?CannyThreshold(lowThreshold):??
  • ????detected_edges?=?cv2.GaussianBlur(gray,(3,3),0)??
  • ????detected_edges?=?cv2.Canny(detected_edges,lowThreshold,lowThreshold*ratio,apertureSize?=?kernel_size)??
  • ????dst?=?cv2.bitwise_and(img,img,mask?=?detected_edges)??#?just?add?some?colours?to?edges?from?original?image.??
  • ????cv2.imshow('canny?demo',dst)??
  • ??
  • lowThreshold?=?0??
  • max_lowThreshold?=?100??
  • ratio?=?3??
  • kernel_size?=?3??
  • ??
  • img?=?cv2.imread('D:/lion.jpg')??
  • gray?=?cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)??
  • ??
  • cv2.namedWindow('canny?demo')??
  • ??
  • cv2.createTrackbar('Min?threshold','canny?demo',lowThreshold,?max_lowThreshold,?CannyThreshold)??
  • ??
  • CannyThreshold(0)??#?initialization??
  • if?cv2.waitKey(0)?==?27:??
  • ????cv2.destroyAllWindows()??
  • 原地址 在此 ,其中還有其他的初級圖像處理的代碼,大伙可以去看看。后續文章將介紹更多的OpenCV的函數使用,以及視頻的處理。

    參考資料:

    1、《Opencv2 Computer Vision Application Programming Cookbook》

    2、《OpenCV References Manule》





    from: http://blog.csdn.net/sunny2038/article/category/904451

    總結

    以上是生活随笔為你收集整理的OpenCV-Python教程(6)(7)(8): Sobel算子 Laplacian算子 Canny边缘检测的全部內容,希望文章能夠幫你解決所遇到的問題。

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