發表文章

目前顯示的是 5月, 2020的文章

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