新しいフィルタを作成し、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)
入力画像:
出力イメージ:
EDIT:編集を1として@Dolphinで示唆されているように、中心値が8のカーネルを使用して、wo uldは循環バイナリディスクの場合に良い結果を得ます。
コードは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」を持っているカーネルで
と「-8」:ここでは、コードから上記の結果です。したがって中間に8を入れ、キャンバスタイプを8ビットのunsigned int(0〜255の整数値)に設定したことを考慮してください。 – dolphin
OPはカスタムカーネルを適用する方法とワークフローについて質問していました。そして、私はちょうど質問自体からカーネルをコピーしました。 – ZdaR
そうですね、私はあなたが言ったことを言いましたが、「現在のフィルターの結果はちょっと変わっているようです」と、黒い背景にある白いディスクのテストケースです。したがって、OPや他の人のための発言だけでは、この特定のテストケースの結果が4から8に変更されても、奇妙なことはありません。素晴らしいサークルが表示されます。 – dolphin