前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用卷积来检测图像物体边缘

使用卷积来检测图像物体边缘

作者头像
灯珑LoGin
发布2022-10-31 13:52:05
3500
发布2022-10-31 13:52:05
举报
文章被收录于专栏:龙进的专栏

对于真实的图片,也可以使用合适的卷积核(3*3卷积核的中间值是8,周围一圈的值是8个-1)对其进行操作,用来检测物体的外形轮廓。主要原理是,若不是图像边缘,则得到的值为0,是边缘则值不为0,就会输出轮廓图。

代码如下:

代码语言:javascript
复制
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 = Image.open('work/000000098520.jpg')

# 设置卷积核参数
w = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], dtype='float32')
w = w.reshape([1, 1, 3, 3])
# 由于输入通道是3, 将卷积核的形状从[1,1,3,3]调整为[1,3,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)))

# 将读入的图片转化为float32类型的numpy.ndarray
x = np.array(img).astype('float32')
# 图片读入成ndarray时,形状是[H,W,3]
# 将通道这一维度调整到最前面
x = np.transpose(x, (2, 0, 1))
# 数据形状调整为[N,C,H,W]形式
x = x.reshape(1, 3, img.height, img.width)
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 feature image', fontsize=15)
plt.imshow(out.squeeze(), cmap='gray')
plt.show()

转载请注明来源:https://www.longjin666.top/?p=1028

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年7月14日2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档