【计算机视觉】不来试试图片轮廓提取?

简介: 🚩 前言最近学到了深度学习的卷积操作,在卷积神经网络出现之前,就已经有使用卷积核 (也叫滤波器),但那时的卷积核依靠人工的经验和知识来进行设计,而不能像卷积神经网络中那样让机器自己学习出合适的卷积核参数。下面就介绍通过卷积来获取图像轮廓图的操作。

🚩 前言

最近学到了深度学习的卷积操作,在卷积神经网络出现之前,就已经有使用卷积核(也叫滤波器),但那时的卷积核依靠人工的经验和知识来进行设计,而不能像卷积神经网络中那样让机器自己学习出合适的卷积核参数。

下面就介绍通过卷积来获取图像轮廓图的操作。

🍈 边缘提取原理

卷积

首先,图片是由像素点构成的。卷积的一个基本操作就是对应元素相乘然后再求和的操作,然后卷积核窗口在图片上不断滑动,就会得到一张新的“特征图”。 (我这里解释得比较草率,可以自行仔细了解一下卷积的过程)

用特殊的卷积核进行轮廓提取

这里使用一维的卷积核 [-1, 0, 1],可以提取图片的垂直边界。实际就是图片中邻近的像素点进行相减操作,边缘处两个像素点的差别很大,于是相减之后得到的值的绝对值就大,这就是我们提取出来的边缘

548cc4497b73453488d7982a799adcf7.png

效果展示

a025039a977f498cae586a3bbb97c393.png

通过改变卷积核的大小,可以改变提取出来的边缘的宽度,例如将卷积核改为:[-1, 0, 0, 1],得到的黑色边缘就更宽了。

d71a8991dc92462397726d5619b3c97c.png

🍏 开始轮廓提取

这里使用下图中的卷积核,原理和之前的垂直边缘检测相似。前面的卷积核只能得到垂直边缘,而下图的卷积核则能得到完整的轮廓

b3b79663dece4d5fb723fdf68bae92e3.png

效果展示

fe39c7fdeda64d9b80ec67b60a052055.png

代码

我这里卷积是通过 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')  # 图片放在py文件相同目录下
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)  # 在通道上复制,得到[1,3,3,3]
# 创建卷积算子
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')  # 读入shape[H,W,C]
x = np.transpose(x, (2, 0, 1))  # 交换维度
x = x.reshape((1, x.shape[-3], x.shape[-2], x.shape[-1]))  # Conv2D的输入需为四维张量
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()

相关文章
|
机器学习/深度学习 PyTorch 算法框架/工具
【python-Unet】计算机视觉~舌象舌头图片分割~机器学习(三)
【python-Unet】计算机视觉~舌象舌头图片分割~机器学习(三)
405 0
|
机器学习/深度学习 算法 计算机视觉
【python】计算机视觉~舌象图片中舌体倾斜判别(四)
【python】计算机视觉~舌象图片中舌体倾斜判别(四)
163 0
|
机器学习/深度学习 计算机视觉 Python
【Python】计算机视觉 手掌图片穴位识别(二)
【Python】计算机视觉 手掌图片穴位识别(二)
166 0
|
3月前
|
机器学习/深度学习 计算机视觉
AIGC核心技术——计算机视觉(CV)预训练大模型
【1月更文挑战第13天】AIGC核心技术——计算机视觉(CV)预训练大模型
517 3
AIGC核心技术——计算机视觉(CV)预训练大模型
|
8月前
|
机器学习/深度学习 PyTorch 算法框架/工具
Azure 机器学习 - 使用 ONNX 对来自 AutoML 的计算机视觉模型进行预测
Azure 机器学习 - 使用 ONNX 对来自 AutoML 的计算机视觉模型进行预测
99 0
|
2月前
|
编解码 机器人 测试技术
2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等
6月还有一周就要结束了,我们今天来总结2024年6月上半月发表的最重要的论文,重点介绍了计算机视觉领域的最新研究和进展。
93 8
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机视觉借助深度学习实现了革命性进步,从图像分类到复杂场景理解,深度学习模型如CNN、RNN重塑了领域边界。
【7月更文挑战第2天】计算机视觉借助深度学习实现了革命性进步,从图像分类到复杂场景理解,深度学习模型如CNN、RNN重塑了领域边界。AlexNet开启新时代,后续模型不断优化,推动对象检测、语义分割、图像生成等领域发展。尽管面临数据隐私、模型解释性等挑战,深度学习已广泛应用于安防、医疗、零售和农业,预示着更智能、高效的未来,同时也强调了技术创新、伦理考量的重要性。
35 1

热门文章

最新文章