2016-09-25 4 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

EDIT:編集を1として@Dolphinで示唆されているように、中心値が8のカーネルを使用して、wo uldは循環バイナリディスクの場合に良い結果を得ます。

+0

と「-8」:ここでは、コードから上記の結果です。したがって中間に8を入れ、キャンバスタイプを8ビットのunsigned int(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() 

4を使用すると結果が大きくなりすぎるので、4ではなく中央のピクセルに8を使用していることに注意してください。カーネルの他の要素(重み)の合計として

あなたが途中で「4」を持っているカーネルで

enter image description here

関連する問題