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

你可能感兴趣的:(python实现卷积)