pytorch实现图像的腐蚀和膨胀
前言:
之所以想到用 pytorch ,主要是因为不想在网络模块中调用 opencv 的函数。
调用 opencv 函数的基本步骤如下:先把 pytorch 的 tensor 转到 cpu 上,然后转换成 numpy,再调整到 uint8 格式,然后才能调用 cv2.erode
。 麻烦不说,还无法充分利用 GPU 的并行加速,同时阻断了 gradient 的传播路径,因此有必要用 pytorch 。
形态学运算的类型
形态学是基于形状处理图像的一组广泛的图像处理运算。形态学运算将结构元素应用于输入图像,从而创建相同大小的输出图像。在形态学运算中,输出图像中每个像素的值基于输入图像中对应像素与其相邻像素的比较。
形态学膨胀和腐蚀
最基本的形态学运算是膨胀和腐蚀。膨胀指将像素添加到图像中对象的边界,而腐蚀指删除对象边界上的像素。对图像中对象添加或删除的像素数量取决于用于处理图像的结构元素的大小和形状。在形态学膨胀和腐蚀运算中,输出图像中任何给定像素的状态通过对输入图像中的对应像素及其相邻像素应用规则来确定。用于处理像素的规则将运算定义为膨胀或腐蚀。下表列出了膨胀和腐蚀的规则。
膨胀和腐蚀的规则
操作 |
规则 |
示例(原始图像和处理后的图像) |
---|---|---|
膨胀 |
输出像素的值是邻域中所有像素的最大值。在二值图像中,如果一个像素的任何相邻像素的值为 形态学膨胀使对象更加明显可见并填充对象中的小孔。线条看起来更粗,填充的形状看起来更大。 |
|
腐蚀 |
输出像素的值是邻域中所有像素的最小值。在二值图像中,如果一个像素的任何相邻像素的值为 形态学腐蚀去除了孤立像素和细线,从而只留下实质对象。剩余线条看起来更细,形状更小。 |
|
下图说明了二值图像的膨胀。结构元素如何定义感兴趣的像素的邻域,该邻域带圆圈。膨胀函数将适当的规则应用于邻域中的像素,并为输出图像中的对应像素赋值。在图中,形态学膨胀函数将输出像素的值设置为 1
,因为由结构元素定义的邻域中的元素之一处于打开状态。有关详细信息,请参阅Structuring Elements。
二值图像的形态学膨胀
下图说明灰度图像的这种处理。膨胀函数将规则应用于感兴趣的圈中像素的邻域。输出图像中对应像素的值被指定为所有邻域像素中的最高值。在图中,输出像素的值是 16
,因为它是由结构元素定义的邻域中的最高值。
灰度图像的形态学膨胀
PyTorch 实现
首先介绍 PyTorch 中一个很有用的函数:unfold
,它的作用是将 tensor 按照固定的 step 和 kernel size 拆分成 patch,每个 patch 为 kernel 覆盖的像素,下面举例说明。
def tensor_erode(self,bin_img, ksize=3): # 已测试 #先为原图加入 padding,防止腐蚀后图像尺寸缩小B, C, H, W = bin_img.shapepad = (ksize - 1) // 2bin_img = F.pad(bin_img, [pad, pad, pad, pad], mode='constant', value=0)# 将原图 unfold 成 patchpatches = bin_img.unfold(dimension=2, size=ksize, step=1)patches = patches.unfold(dimension=3, size=ksize, step=1)# B x C x H x W x k x k# 取每个 patch 中最小的值eroded, _ = patches.reshape(B, C, H, W, -1).min(dim=-1)return eroded
下面是膨胀,按照原理将min改为max即可,这个膨胀的功能暂时还没有测试,上面那个测试是可以使用的。
def tensor_dilate(self,bin_img, ksize=3): ## 首先为原图加入 padding,防止图像尺寸缩小B, C, H, W = bin_img.shapepad = (ksize - 1) // 2bin_img = F.pad(bin_img, [pad, pad, pad, pad], mode='constant', value=0)# 将原图 unfold 成 patchpatches = bin_img.unfold(dimension=2, size=ksize, step=1)patches = patches.unfold(dimension=3, size=ksize, step=1)# B x C x H x W x k x k# 取每个 patch 中最小的值,i.e., 0dilate, _ = patches.reshape(B, C, H, W, -1).max(dim=-1)return dilate
pytorch实现图像的腐蚀和膨胀相关推荐
- 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作
图像形态学中两种最基本的操作就是对图形的腐蚀和膨胀,可以说,形态学中的中高级操作都是建立在这两种操作之上.通过这两种基本的运算可以去除图像中的噪声,分割出独立的区域或者将两个区域连接在一起. 关于图像 ...
- cuda学习笔记5——CUDA实现图像形态学腐蚀、膨胀
cuda学习笔记5--CUDA实现图像形态学腐蚀.膨胀 代码 linux如何编译cuda和opencv代码 耗时情况 代码 #include "cuda_runtime.h" #i ...
- 简单说说我理解的图像的腐蚀和膨胀
写这篇文章的时候在想办法搞opencv,看着课上教的莫名其妙,直接给我整不会了,借此机会记下来怎么腐蚀和膨胀 腐蚀 这里借一下图,原帖(5条消息) 图像的腐蚀与膨胀_张齐贤的博客-CSDN博客_腐蚀膨 ...
- OpenCV学习(12) 图像的腐蚀与膨胀(3)
通过使用不同的结构元素来进行膨胀腐蚀操作,可以检测图像中的角点,下面就一步一步看这个算法如果实现角点检测. 原图像: 首先我们创建四个结构元素 先用十字结构元素对原图像进行膨胀操作,得到下面的图像 再 ...
- opencv 图像的腐蚀与膨胀
形态学操作就是基于形状的一系列图像处理操作.通过将 结构元素 作用于输入图像来产生输出图像. 最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation). 他们的运用广泛: 消除噪声 ...
- matlab图像的腐蚀和膨胀_OpenCV图像处理系列八 --- 腐蚀与膨胀
今天,我们一起来学习图像形态学操作中两种最基本的形态学操作,即腐蚀与膨胀. 一.理论 数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数 ...
- opengl对图像进行腐蚀和膨胀
效果图 膨胀的原理: 膨胀就是求局部最大值的操作,就是给定一个核对图像进行卷积操作,见下图 将核B与图像A卷积,即计算B覆盖区域的像素点的最大值,并把这个最大值赋给参考点指定的像素,这样 就会使图像中 ...
- 图像形态学概要-腐蚀、膨胀、开运算、闭运算、形态学梯度(形态学边缘提取)、顶帽操作、黑帽操作
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像形态学中两种最基本的操作就是对图形的腐蚀和膨 ...
- 基于python的opencv图像形态学处理(图像腐蚀与膨胀操作以及礼帽与黑帽)
腐蚀与膨胀 图像的腐蚀与膨胀互为逆向操作,通常用于处理二值图像(黑白图,以黑色为底面背景),因此需要先进行二值化处理,腐蚀和膨胀通俗的理解就是,在指定大小的卷积核内,如果该卷积核内全为黑色或全为白色, ...
最新文章
- 谷歌李飞飞:我们依旧站在人工智能研究的起点
- Linux运维之批量下载指定网站的100个图片文件,并找出大于200KB的文件
- Windows电脑C盘老是报红
- 菜鸟要做架构师(一)——如何快速开发中小型系统
- AtCoder Beginner Contest 204 F Hanjo 2
- 实战 SSH 端口转发
- 【排序】算法(python实现)
- hapi 使用 lab 和 code 进行测试
- mySQL字符串字段区别_MySQL类型之(字符串列类型区分、数据类型区分)
- 10.看板方法---设置在制品限额
- 一眼把人看穿之社交方式 如何辨别朋友的信任度
- C/C++[结构体]
- 电脑一直显示服务器不兼容,原神PC版提示版本不兼容怎么办 PC版常见问题介绍...
- 信号与系统Matlab实验1
- 博科交换机建立Zone基本配置
- C语言实现自制图片文件合成器
- 计算机专业英语复习第一天
- 云服务器日志4625登录验证失败
- 查询微信被谁投诉方法技巧
- 何恺明一作论文 MAE 已有人复现!PyTorch 版!