文章目录
🚩 前言
最近学到了深度学习的卷积操作,在卷积神经网络出现之前,就已经有使用卷积核 (也叫滤波器),但那时的卷积核依靠 人工的经验和知识来进行设计,而不能像卷积神经网络中那样让机器自己学习出合适的卷积核参数。
下面就介绍通过卷积来获取图像 轮廓图的操作。
🍈 边缘提取原理
卷积
首先,图片是由像素点构成的。卷积的一个基本操作就是 对应元素相乘然后再求和的操作,然后卷积核窗口在图片上不断 滑动,就会得到一张新的”特征图”。 (我这里解释得比较草率,可以自行仔细了解一下卷积的过程)
用特殊的卷积核进行轮廓提取
这里使用一维的卷积核 [-1, 0, 1],可以提取图片的 垂直边界。实际就是图片中邻近的像素点进行相减操作,边缘处两个像素点的差别很大,于是相减之后得到的值的绝对值就大,这就是我们提取出来的 边缘。
效果展示:
通过改变卷积核的大小,可以改变提取出来的边缘的宽度,例如将卷积核改为:[-1, 0, 0, 1],得到的黑色边缘就更宽了。
; 🍏 开始轮廓提取
这里使用下图中的卷积核,原理和之前的垂直边缘检测相似。前面的卷积核只能得到垂直边缘,而下图的卷积核则能得到 完整的轮廓。
效果展示:
代码
我这里卷积是通过 paddle 的库实现的,因此需要先安装 paddle。安装教程参加:paddle安装教程。
如果觉得安装太麻烦也没关系,可以试试 AI Studio 的在线环境,已经内置了 paddle 库:AI Studio。点击 项目-> 创建项目,就可以开始使用啦!
导入依赖:
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import paddle
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
通过调整代码
img = img.resize((200, 200), Image.ANTIALIAS)
括号中的数值,你将得到不同的轮廓提取效果! (数值控制图片的尺寸)
卷积核不变时,图片尺寸越大,提取的轮廓也就 相对显得越细,就越不明显。而图片尺寸小时又会显得 模糊,像打了马赛克。
运行代码:
img = Image.open('喵喵头像.jpg')
img = img.resize((200, 200), Image.ANTIALIAS)
w = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32')/8
w = w.reshape([1, 1, 3, 3])
w = np.repeat(w, 3, axis=1)
conv = Conv2D(in_channels=3, out_channels=1, kernel_size=[3, 3],
weight_attr=paddle.ParamAttr(
initializer=Assign(value=w)
))
x = np.array(img).astype('float32')
x = np.transpose(x, (2, 0, 1))
x = x.reshape((1, x.shape[-3], x.shape[-2], x.shape[-1]))
x = paddle.to_tensor(x)
y = conv(x)
out = y.numpy()
plt.figure(figsize=(20, 10))
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img)
f = plt.subplot(122)
f.set_title('output image', fontsize=15)
plt.imshow(out.squeeze(), cmap='gray')
plt.show()
完
14天学习训练营导师课程:
杨鑫《Python 自学编程基础》
杨鑫《 Python 网络爬虫基础》
杨鑫《 Scrapy 爬虫框架实战和项目管理》Original: https://blog.csdn.net/m0_63238256/article/details/127930142
Author: 清风莫追
Title: 【计算机视觉】不来试试图片轮廓提取?
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/718880/
转载文章受原作者版权保护。转载请注明原作者出处!