標籤:

Opencv學習筆記(1)

一.2D convolution

卷積在圖像操作里是一種基本的運算,即將對應的像素計算出值並改變,為了能夠計算,我們需要使用另一種工具,核(kernel),一般即將核與對應位置相計算並加起來。

高通濾波:用於檢查圖像的某個區域,並根據與周圍像素的強度差異增強某些像素的強度。(例如下矩陣)。

低通濾波:與高通濾波相反,高通濾波會強化這種差異,而低通濾波會減緩這種差異,通常的模糊化(blurring),去噪(denoise)即使用如此。

1.模糊化(blurrning)

這裡使用一種低通濾波的矩陣

其中的1/9 是叫正規化(normalization),這樣不會增加像素的強度。

通常來說,核越大,模糊的越厲害。如(3X3上右,5X5下)(代碼如下)

import cv2import numpy as npimg = cv2.imread("E:/flower.jpg")rows,cols =img.shape[:2]kernel_identity = np.array([[0,0,0],[0,1,0],[0,0,0]])kernel_3X3 = np.ones((3,3),np.float32)/9.0kernel_5X5 = np.ones((5,5),np.float32)/25.0output1 = cv2.filter2D(img,-1,kernel_identity)output2 = cv2.filter2D(img,-1,kernel_3X3)output3 = cv2.filter2D(img,-1,kernel_5X5)cv2.imshow("1",output1)cv2.imshow("2",output2)cv2.imshow("3",output3)cv2.waitKey(0)

或者可以直接使用output = cv2.blur(img, (3,3)) 函數。

2.邊緣檢測(Edge detection )

Sobel濾波:(左邊是橫向horizontal 檢測,右邊是垂向vertical 檢測)

除了使用filter2D等方法,opencv里可以直接調用sobel函數。

sobel演算法主要是通過計算該點的灰度值,

如果大於某一閾值,則認為是邊緣點,再來計算梯度來反應方向。

但sobel運算元只能檢測橫向,或縱向,不能給我們一個整體的圖像,此時可以使用laplacian 函數。檢測效果如圖:

代碼import cv2import numpy as npimg = cv2.imread("E:/flower.jpg",cv2.IMREAD_GRAYSCALE)rows,cols = img.shape[:2]x = cv2.Sobel(img,cv2.CV_16S,1,0,ksize = 3) y = cv2.Sobel(img,cv2.CV_16S,0,1,ksize = 3)laplacian = cv2.Laplacian(img,cv2.CV_16S) absX = cv2.convertScaleAbs(x) # 轉回uint8 absY = cv2.convertScaleAbs(y)laplacian = cv2.convertScaleAbs(laplacian) dst = cv2.addWeighted(absX,0.5,absY,0.5,0) cv2.imshow("absX", absX) cv2.imshow("absY", absY) cv2.imshow("Result", dst)cv2.imshow("Final",laplacian) cv2.waitKey(0) Notes:##cv2.Sobel(src, depth, 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。

還有一種是canny運算元。

canny = cv2.Canny(img, 50, 240) ,第一個是低閾值,第二個是高閾值。

演算法:如果該點的梯度閾值大於高閾值,則被認為是強點,演算法則會以該點為基礎來追蹤邊緣線,直到梯度小於低閾值停止。因此如果調大第二個值的話,線條通常會減少。

效果圖(上限為220,下限為10):

3.其他也有一些比較好玩的核(kernel),

如,運動模糊,矩陣類似為:

這裡使用了15X15的。效果如:

size = 15kernel_blur = np.zeros((size,size))kernel_blur[int((size - 1)/2),:] = np.ones(size)kernel_blur = kernel_blur/size

銳化(sharping)

矩陣類似為:

kernel_sharpen1 = np.array([[-1,-1,-1],[-1,9,-1],[-1,-1,-1]])#sharpkernel_sharpen2 = np.array([[1,1,1],[1,-7,1],[1,1,1]])#Excessive sharpkernel_sharpen3 = np.array([[-1,-1,-1,-1,-1],[-1,2,2,2,-1], [-1,2,8,2,-1],[-1,2,2,2,-1],[-1,-1,-1,-1,-1]])/8.0#edge enhancing

推薦閱讀:

如何在阿里ECS雲端運行Jupyter Notebook進行機器/深度學習?
用 Python 解析李小璐的微博,驚呆了!
Python徒手實現手寫數字識別—大綱
黑客你好,請使用Python編寫一個滲透測試探測器
NumPy基礎:多維數組

TAG:OpenCV | Python |