一、卷积核
平滑图像卷积核、锐化图像卷积核、拉普拉斯核(检测边缘)、Sobel 检测x方向和y方向边缘、浮雕滤波器,会使图像呈现出浮雕效果
二、代码演示
keras_cifar10.py:
from skimage.exposure import rescale_intensity
import numpy as np
import argparse
import cv2
def convolve(image,K):
#获取图像和内核的空间维度(宽和高)
(iH,iW) = image.shape[:2] # 0,1 无2(通道)
(kH,kW) = K.shape[:2]
#将图像四周填充 保持卷积后维度不变
pad = (kW - 1)//2
image = cv2.copyMakeBorder(image, pad, pad, pad, pad, cv2.BORDER_REFLECT)
output = np.zeros((iH,iW), dtype='float')
for y in np.arange(pad, iH+pad):
for x in np.arange(pad,iW+pad):
#以(x,y)为中心
roi = image[y-pad:y+pad+1,x-pad:x+pad+1]
k = (roi*K).sum()
output[y-pad,x-pad] = k
#卷积,会使像素值超出255 所以先缩放
output = rescale_intensity(output,in_range=(0,255))
output = (output*255).astype("uint8")
return output
#构造平滑图像的卷积核7*7 21*21
smallBlur = np.ones((7,7),dtype='float')*(1.0/(7*7))
largeBlur = np.ones((21,21),dtype='float')*(1.0/(21*21))
#锐化图像卷积核
sharpen = np.array(([0,-1,0],
[-1,5,-1],
[0,-1,0]),dtype='int')
#拉普拉斯核 检测边缘
laplacian = np.array(([0,1,0],
[1,-4,1],
[0,1,0]),dtype='int')
#Sobel 检测x方向和y方向边缘
#x方向
sobelX = np.array((
[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]), dtype="int")
#y方向
sobelY = np.array((
[-1, -2, -1],
[0, 0, 0],
[1, 2, 1]), dtype="int")
#浮雕滤波器,会使图像呈现出浮雕效果
emboss = np.array((
[-2, -1, 0],
[-1, 1, 1],
[0, 1, 2]), dtype="int")
#卷积核列表
kernelBank = (
("small_blur", smallBlur),
("large_blur", largeBlur),
("sharpen", sharpen),
("laplacian", laplacian),
("sobel_x", sobelX),
("sobel_y", sobelY),
("emboss", emboss))
#此处加载自己的图像
image = cv2.imread("D:/DLCV/DLCV/my_study/datasets/images/dog.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
for (kernelName, K) in kernelBank:
print("[INFO] applying {} kernel".format(kernelName))
convolveOutput = convolve(gray, K)
#cv2.filter2D是OpenCV的卷积函数的更优化的版本
opencvOutput = cv2.filter2D(gray, -1, K)
# show the output images
cv2.imshow("Original", gray)
cv2.imshow("{} - convole".format(kernelName), convolveOutput)
cv2.imshow("{} - opencv".format(kernelName), opencvOutput)
cv2.waitKey(0)
cv2.destroyAllWindows()