写这些博客主要是记录自己学习Opencv的过程,也希望能帮助到大家。
在OpenCV中,允许用户自定义卷积核实现卷积操作,使用自定义卷积核实现卷积操作的函数是cv2.filter2D(),其语法格式为:
dst=cv2.filter2D(src,ddepth,kernel,anchor,delta,borderType)
式中:
● dst是返回值,表示进行方框滤波后得到的处理结果。
● src 是需要处理的图像,即原始图像。它能够有任意数量的通道,并能对各个通道独立处理。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一 种。
● ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。
● kernel是卷积核,是一个单通道的数组。如果想在处理彩色图像时,让每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作。
● anchor 是锚点,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位 置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
● delta 是修正值,它是可选项。如果该值存在,会在基础滤波的结果上加上该值作 为最终的滤波处理结果。
● borderType是边界样式,该值决定了以何种情况处理边界,通常使用默认值即可。
在一般情况下,使用cv.filter2D()时,对于参数锚点anchor,修正值delta,边界样式borderType,直接采用其默认值即可。
因此,cv.filter2D()的常用形式为:
dst=cv2.filter2D(src,ddepth,kernel)
例:
import cv2 as cv
import numpy as np
def cv_show(name, img):
cv.imshow(name, img)
cv.waitKey(0)
cv.destroyAllWindows()
# 卷积操作
src = np.array([[1,2,3,4,5],
[6,7,8,9,10],
[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25]],dtype='float32')
kernel1 = np.ones((3,3), dtype='float32')/9
result = cv.filter2D(src, -1,kernel=kernel1)
print('卷积前矩阵为:\n {}'.format(src))
print('卷积后矩阵为:\n {}'.format(result))
# 与图像做卷积操作
img = cv.imread('D:\\dlam.jpg')
if img is None:
print('Failed to read the imagine')
kernel2 = np.ones((7,7), dtype='float32')/49
result2 = cv.filter2D(img, -1,kernel=kernel2)
cv_show('哆啦A梦',img)
cv_show('reslut', result2)
结果如下:
卷积前矩阵为:
[[ 1. 2. 3. 4. 5.]
[ 6. 7. 8. 9. 10.]
[11. 12. 13. 14. 15.]
[16. 17. 18. 19. 20.]
[21. 22. 23. 24. 25.]]
卷积后矩阵为:
[[ 5. 5.3333335 6.3333335 7.333333 7.666667 ]
[ 6.666667 7. 8. 9. 9.333333 ]
[11.666668 12. 13. 13.999999 14.333334 ]
[16.666666 17. 17.999998 19. 19.333332 ]
[18.333334 18.666666 19.666668 20.666668 21. ]]
可以明显的看出图像变模糊了
文章出处登录后可见!