卷积:
什么是二维卷积呢?看下面一张图就一目了然:
卷积就是循环对图像跟一个核逐个元素相乘再求和得到另外一副图像的操作,比如结果图中第一个元素5是怎么算的呢?原图中3×3的区域与3×3的核逐个元素相乘再相加:1×1 + 2×0 + 1×0 + 0×0 + 1×0 + 1×0 + 3×0 + 0×0 + 2×2 = 5
。算完之后,整个框再往右移一步继续计算,横向计算完后,再往下移一步继续计算……
代码实现:
import cv2
import numpy as np
img = cv2.imread('1-test.jpg',cv2.IMREAD_GRAYSCALE) #提取图像灰度值
(height,width) = img.shape #提取长宽
img_new = np.zeros([img.shape[0]-2,img.shape[1]-2]) #创建一个新图像存储卷积图像(新图像的长和宽分别比原图像小2,因为第一行和第一列,最后一行和最后一列无法被卷积)
#xximg = np.ones([400, 400, 1], np.uint8)
print(img_new,np.shape(img),np.shape(img_new)) #查看图像信息
laplacien = np.array(([-1,-1,-1],[-1,8,-1],[-1,-1,-1]))#拉普拉斯卷积核
#
for y in range(1,height-2):
for x in range(1,width-2):
dataV = (8*img[y, x]-img[y-1, x-1]-img[y-1, x]-img[y-1, x+1]-img[y, x-1]-img[y, x+1]-img[y+1, x-1]-img[y+1, x]-img[y+1, x+1])
if(dataV<0):
img_new[y-1, x-1] = 0
else:
img_new[y-1, x-1] = dataV
cv2.imwrite('1-test-laplacien.jpg', img_new)
img_new = img_new.astype(np.uint8)
cv2.namedWindow('img_new')
cv2.imshow('img_new',img_new)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
(a)原图
(b)灰度图
(c)结果图