2016-09-25 21 views

回答

5

至於將自定義內核應用於給定圖像,您可以簡單地使用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) 

輸入圖像:

enter image description here

輸出圖像:

enter image description here

編輯:作爲每編輯由@Dolphin建議,使用中心值爲8的內核,wo在圓形二進制盤的情況下,可以獲得好的結果。

+0

在你的內核,你在中間,「-8」與其他元素的總和內核(權重)有「4」。因此,將8放在中間,並考慮將畫布類型設置爲8位無符號整數(從0到255的整數值)。 – dolphin

+0

OP只是詢問應用定製內核的方法和工作流程。我剛剛從問題本身複製了內核。 – ZdaR

+1

對,我指的是你所說的「但是目前的過濾器的結果看起來有點奇怪」和你在黑色背景上的白色磁盤的特殊測試案例。所以只是一個評論(對於OP或其他人),當你改變4到8時,這個特定測試用例的結果不會很奇怪,你會看到一個很好的圓圈。 – dolphin

2

您可以修改代碼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會使結果變暗得太多。下面是從上面的代碼的結果:

enter image description here

相關問題