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