def conv_only():
'''
对输入的单张图像做卷积运算
'''
def ImgConvolve(image_array, kernel):
image_arr = image_array.copy()
# 灰度图像矩阵的维度
img_dim1, img_dim2 = image_arr.shape
# 过滤器的维度
k_dim1, k_dim2 = kernel.shape
# 填充时增加的高和宽度
AddW = int((k_dim1-1)/2)
AddH = int((k_dim2-1)/2)
# padding填充
temp = np.zeros([img_dim1 + AddW*2, img_dim2 + AddH*2])
# 将原图拷贝到临时图片的中央,这样临时图片就是在原图的基础上padding=1的0像素的填充
temp[AddW:AddW+img_dim1, AddH:AddH+img_dim2] = image_arr[:, :]
# 初始化一张同样大小的输出图片
output = np.zeros_like(a = temp)
# 将扩充后的图和卷积核进行卷积
for i in range(AddW, AddW+img_dim1):
for j in range(AddH, AddH+img_dim2):
# 只填充了和原图像一样大小的位置
# (i-AddW)-(i+AddW+1) = 2*AddW + 1 = k_dim1正好为卷积核的维度
output[i][j] = int(np.sum(temp[i-AddW:i+AddW+1, j-AddH:j+AddH+1] * kernel))
return output[AddW:AddW+img_dim1, AddH:AddH+img_dim2]
# 提取竖直方向特征
kernel_1 = np.array([
[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]
])
# 提取水平方向特征
kernel_2 = np.array([
[-1, -2, -1],
[0, 0, 0],
[1, 2, 1]
])
# Laplace扩展算子
kernel = np.array([
[1, 1, 1],
[1, -8, 1],
[1, 1, 1]
])
# 打开图像并转换为灰度图像
image = Image.open("3.jpg").convert("L")
#image = cv2.GaussianBlur(image, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
# 将图像转换为数组
image_array = np.array(image)
# 卷积操作
sobel_x = ImgConvolve(image_array, kernel_1)
sobel_y = ImgConvolve(image_array, kernel_2)
laplace = ImgConvolve(image_array, kernel)
#ret, binary = cv2.threshold(sobel_x, 150, 255, cv2.THRESH_BINARY)
#cv2.imshow('adnd',sobel_x)
#cv2.waitKey(0)
#cv2.namedWindow('sobel_x',cv2.WINDOW_NORMAL)
#cv2.resizeWindow('sobel_x',300,300)
#cv2.imshow("sobel_x", sobel_x)
#cv2.imshow("sobel_y", sobel_y)
#cv2.imshow("laplace", laplace)
#cv2.waitKey(0)
plt.imshow(image_array,cmap=cm.gray)
plt.axis("off")
plt.show()
plt.imshow(sobel_x, cmap=cm.gray)
#print(image_array.shape)
#cv2.imwrite('huidu2.jpg',sobel_x)
plt.axis("off")
plt.show()
plt.imshow(sobel_y, cmap=cm.gray)
plt.axis("off")
plt.show()
plt.imshow(laplace, cmap=cm.gray)
plt.axis("off")
plt.show()
十、OpenCV对一张图像做卷积运算
最新推荐文章于 2024-04-18 01:52:59 发布