cv2.Laplacian

仔細看一下這個 3×3 kernel,有沒有注意到該 kernel 的九個值全部加起來為 0(-1×8+8=0)?也就是說,當影像區域的色彩一致時(可能為背景),kernel 計算出的平均值為 0,代表輸出值(kernel anchor)等於 0(黑色),而倘若影像區域的中間顏色比周圍亮(代表可能為物體的交界處),此時 kernel 中間的數值 8 便會強化加大該交界值而變得更亮,-1 則淡化了周圍非物件邊緣的像素強度,使得整體算出的輸出值(kernel anchor)更大。
程式碼:
import cv2
img=cv2.imread("8.png",0)
gray_lap = cv2.Laplacian(img, cv2.CV_16S, ksize=3)
"""
即Sobel函式求完導數後會有負值,還有會大於255的值。
而原影象是uint8,即8位無符號數,所以Laplacian建立的影象位數不夠,會有截斷。
因此要使用16位有符號的資料型別,即cv2.CV_16S。
"""
dst = cv2.convertScaleAbs(gray_lap) # 轉回uint8
"""
convertScaleAbs函數是一個位深轉化函數,可將任意類型的數據轉化為CV_8UC1。具體數據處理方式如下:
(1). 對於src*alpha+beta的結果如果是負值且大於-255,則直接取絕對值;
(2). 對於src*alpha+beta的結果如果大於255,則取255;
(3). 對於src*alpha+beta的結果是負值,且小於-255,則取255;
(4). 對於src*alpha+beta的結果如果在0-255之間,則保持不變;
"""
print(dst)
cv2.imshow("orign", img)
cv2.imshow('laplacian', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

結果:
參考:
https://blog.csdn.net/u013230291/article/details/100557267
https://www.itread01.com/content/1542925983.html
https://makerpro.cc/2019/06/the-convolution-of-opencv/

留言

這個網誌中的熱門文章

以dlib實現人臉辨識打卡系統

以python讀取yolo的輸出-darknet.py

使用Python達成影像形態學處理(不使用Opencv函式庫)