如何在python2.7中使用cv2创建一个新的过滤器并将其应用于图像?

时间:2016-09-25 10:19:23

标签: python python-2.7 opencv

如何使用python2.7中的cv2创建一个新过滤器并将其应用于图像?

例如:

kernel = np.array([[-1, -1, -1],
                   [-1,  4, -1],
                   [-1, -1, -1]])

我是opencv的新手,所以如果你能解释一下,那就太棒了。谢谢!

2 个答案:

答案 0 :(得分:8)

就将自定义内核应用于给定图像,您只需使用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的内核,在圆形二进制光盘的情况下会获得良好的效果。

答案 1 :(得分:4)

您可以在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