高斯分布函数
12𝜋𝛿2𝑒−((𝑥−𝑥0)2+(𝑦−𝑦0)2)2𝛿2
kernel_size = 9 sigma = 1 def gassian_kernel(kernel_size, sigma): kernel = np.zeros((kernel_size, kernel_size), dtype=np.float) centre = kernel_size // 2 for i in range(kernel_size): for j in range(kernel_size): d = (i - centre)**2 + (j - centre)**2 kernel[i, j] = np.exp(-d/(2*sigma**2)) kernel /= (2 * np.pi * sigma**2) kernel /= kernel.sum() # 归一化 return kernel kernel = gassian_kernel(kernel_size, sigma) kernel def convolution(img, kernel): img_h, img_w = img.shape[:2] bored = int(kernel.shape[0] / 2) new_img = np.zeros((img_h, img_w, 3), dtype=np.float) for c in range(3): for x in range(bored, img_w - bored): for y in range(bored, img_h - bored): new_img[y, x, c] = np.sum(kernel * img[y-bored:y+bored+1, x-bored:x+bored+1, c]) new_img = np.clip(new_img, 0, 255) new_img = new_img.astype(np.uint8) return new_img img = convolution(cat_img, kernel) print(img.shape) plt.imshow(img) def add_padding(img, kernel_size): p = kernel_size//2 black = [0, 0, 0] padding_img = cv2.copyMakeBorder(img, p, p, p, p, cv2.BORDER_CONSTANT, value=black ) return padding_img img = convolution(add_padding(cat_img, kernel_size), kernel) print(img.shape) plt.imshow(img)