Python OpenCV -- Sobel 運算元
阿新 • • 發佈:2018-12-13
本文章轉載自:https://blog.csdn.net/mokeding/article/details/19371735
Sobel 運算元
Sobel 運算元 -- 是一種帶有方向性的濾波器,
在Python 中的原型:
dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
src -- 原影象
ddepth -- 影象的深度,-1 表示採用的是與原影象相同的深度。目標影象的深度必須大於等於原影象的深度。
dx dy -- 表示的是示導的階數,0 表示這個方向上沒有求導,一般為 0,1,2。
【可選引數】
dst -- 目標影象,與原影象(src)據有相同的尺寸和通道
ksize -- Sobel運算元的大小,必須為1、3、5、7。
scale -- 縮放導數的比例常數,預設情況下沒有伸縮係數
delta -- 一個可選的增量,將會加到最終的dst中,同樣,預設情況下沒有額外的值加到dst中
borderType -- 判斷影象邊界的模式。這個引數預設值為cv2.BORDER_DEFAULT。
使用示例:
#!/usr/bin/env python # encoding: utf-8 import cv2 import numpy as np img = cv2.imread("2.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("X", absX) cv2.imshow("Y", absY) cv2.imshow("Result", dst) cv2.waitKey(0) cv2.destroyAllWindows()
cv2.CV_16S -- Sobel 函式求完導數後會有負值和大於255的值,而原影象是uint8(8位無符號資料),所以在建立影象時長度不夠,會被截斷,所以使用16位有符號資料。
convertScaleAbs() -- 轉回uint8形式,否則將無法顯示影象,而只是一副灰色影象
addWeighted() -- 組合影象
函式原型:
dst = cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
src -- 原影象
dst -- 目標影象
alpha -- 伸縮係數
beta -- 累加到結果上的一個值
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
alpha -- 第一幅圖片中元素的權重
beta -- 第二個權重
gamma -- 累加到結果上的一個值
效果影象: