如何使用python2.7中的cv2創建一個新的過濾器並將其應用於圖像?如何使用python2.7中的cv2創建一個新的過濾器並將其應用於圖像?
例如:
kernel = np.array([[-1, -1, -1],
[-1, 4, -1],
[-1, -1, -1]])
我是新來的OpenCV所以如果你能解釋那簡直太好了。謝謝!
如何使用python2.7中的cv2創建一個新的過濾器並將其應用於圖像?如何使用python2.7中的cv2創建一個新的過濾器並將其應用於圖像?
例如:
kernel = np.array([[-1, -1, -1],
[-1, 4, -1],
[-1, -1, -1]])
我是新來的OpenCV所以如果你能解釋那簡直太好了。謝謝!
至於將自定義內核應用於給定圖像,您可以簡單地使用filter2D方法來提供自定義過濾器。你也可以複製下面的代碼讓你去。但隨着當前過濾的結果似乎有點不可思議:
import cv2
import numpy as np
# Create a dummy input image.
canvas = np.zeros((100, 100), dtype=np.uint8)
canvas = cv2.circle(canvas, (50, 50), 20, (255,), -1)
kernel = np.array([[-1, -1, -1],
[-1, 4, -1],
[-1, -1, -1]])
dst = cv2.filter2D(canvas, -1, kernel)
cv2.imwrite("./filtered.png", dst)
輸入圖像:
輸出圖像:
編輯:作爲每編輯由@Dolphin建議,使用中心值爲8的內核,wo在圓形二進制盤的情況下,可以獲得好的結果。
您可以修改代碼http://docs.opencv.org/3.1.0/d4/d13/tutorial_py_filtering.html。 這是一個OpenCV 3頁面,但它可以用於OpenCV 2.
以下代碼的唯一區別是如何設置內核。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv_logo.png')
kernel = np.ones((3,3),np.float32) * (-1)
kernel[1,1] = 8
print(kernel)
dst = cv2.filter2D(img,-1,kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dst),plt.title('Filters')
plt.xticks([]), plt.yticks([])
plt.show()
請注意,我用8代替了4的中心像素,因爲使用4會使結果變暗得太多。下面是從上面的代碼的結果:
在你的內核,你在中間,「-8」與其他元素的總和內核(權重)有「4」。因此,將8放在中間,並考慮將畫布類型設置爲8位無符號整數(從0到255的整數值)。 – dolphin
OP只是詢問應用定製內核的方法和工作流程。我剛剛從問題本身複製了內核。 – ZdaR
對,我指的是你所說的「但是目前的過濾器的結果看起來有點奇怪」和你在黑色背景上的白色磁盤的特殊測試案例。所以只是一個評論(對於OP或其他人),當你改變4到8時,這個特定測試用例的結果不會很奇怪,你會看到一個很好的圓圈。 – dolphin