python实现卷积_python实现卷积计算(采用opencv模块)

1

卷积:简单说卷积是两个变量在某范围内相乘后求和的结果。

输出 = 输入 * 系统

任一个线性系统的输出都可以通过将输入信号与系统函数(系统的冲激响应)做卷积获得。

总之很复杂的感觉,理论大家查信号处理的书。或者百度有大量文章介绍。

感谢opencv把如此复杂的处理用一个

cv.Filter2D(src, dst, kernel, anchor=(-1, -1)) 就搞定了。

方便了我们自行计算卷积。

我们的任务是自己构建卷积核。

2

图像处理:用一个模板和一幅图像进行卷积,对于图像上的一个点,让模板的原点和该点重合,然后模板上的点和图像上对应的点相乘,然后各点的积相加,就得到该点的卷积值。对图像上的每个点都这样处理。由于多数模板都对称,所以模板不旋转。

import cv2  as cvimport  numpy as npimport copyimport osfrom matplotlib import pyplot as pltfrom skimage.measure import compare_ssimimport randomimage = cv.imread('c:\\meiping1.png')gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)cv.imshow("gray",gray)rows,cols,channel = image.shapeimage2 = copy.copy(gray)

3

定义核

kernel = np.ones((5,5),np.float32)/25

result = cv.filter2D(image2,-1,kernel)

plt.subplot(121),plt.imshow(gray),plt.title('gray')plt.xticks([]), plt.yticks([])plt.subplot(122),plt.imshow(result),plt.title('result')plt.xticks([]), plt.yticks([])plt.show()

注意plt输出和imread 颜色次序不同所以有偏色 不影响演示。

转换颜色方法以前文章有介绍。

4

kernel1 = np.array([[ -1,-1, 0],                                   [ -1, 0, 1],                [  0, 1, 1]])

result1= cv.filter2D(image2,-1,result1)

plt.subplot(121),plt.imshow(gray),plt.title('gray')plt.xticks([]), plt.yticks([])plt.subplot(122),plt.imshow(result1),plt.title('result1')plt.xticks([]), plt.yticks([])plt.show()

5

kernel_usm = np.array([        [-1,-1,-1],        [-1,9,-1],        [-1,-1,-1]])

kernel_usm_result= cv.filter2D(image2,-1,kernel_usm_result)

plt.subplot(121),plt.imshow(gray),plt.title('gray')plt.xticks([]), plt.yticks([])plt.subplot(122),plt.imshow(kernel_usm_result),plt.title('kernel_usm_result')plt.xticks([]), plt.yticks([])#plt.show()

6

kernel2 = np.array([        [-1,-1,-1],        [-1,8,-1],        [-1,-1,-1]])

result2 = cv.filter2D(image2,-1,kernel2)

plt.subplot(121),plt.imshow(gray),plt.title('gray')plt.xticks([]), plt.yticks([])plt.subplot(122),plt.imshow(result2),plt.title('result2')plt.xticks([]), plt.yticks([])plt.show()

7

kernel3 = np.array([        [1,1,1],        [1,-7,1],        [1,1,1]])

result3 = cv.filter2D(image2,-1,kernel3)

plt.subplot(121),plt.imshow(gray),plt.title('gray')plt.xticks([]), plt.yticks([])plt.subplot(122),plt.imshow(result3),plt.title('result3')plt.xticks([]), plt.yticks([])plt.show()

8

kernel4 = np.array([        [-1,-1,-1,-1,-1],        [-1,2,2,2,-1],        [-1,2,8,2,-1],        [-1,2,2,2,-1],        [-1,-1,-1,-1,-1]])/8.0

result4 = cv.filter2D(image2,-1,kernel4)

plt.subplot(121),plt.imshow(gray),plt.title('gray')plt.xticks([]), plt.yticks([])plt.subplot(122),plt.imshow(result4),plt.title('result4')plt.xticks([]), plt.yticks([])plt.show()

END

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值