基于一维级联快速膨胀与腐蚀算法
时间:2022-05-07
本文章向大家介绍基于一维级联快速膨胀与腐蚀算法,主要内容包括一:基本原理、二:代码实现(Java语言实现)、三:耗时比较、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一:基本原理
膨胀与腐蚀是图像形态学两个基本操作之一,传统的代码实现都是基于二维窗口卷积模式,对于正常的3x3窗口要八次与运算,而基于一维级联方式先X方向后Y方向只需要4次与运算即可。对于结构元素比较大的矩形来说,我们还可以通过连续的3x3的级联腐蚀或者膨胀来替代,假设对于11x11窗口大小腐蚀来说,正常的计算需要120次的与操作,而通过一维级联腐蚀只需要在X方向10次与操作,Y方向10次与操作,总计2x10=20次与操作即可实现。这样就极大的提高了二值图像腐蚀与膨胀的计算效率。图示如下:
二:代码实现(Java语言实现)
基于一维级联快速腐蚀算法代码实现:
@Overridepublic void process(int width, int height) { int size = width*height; byte[] output = new byte[size]; System.arraycopy(data, 0, output, 0, size); // X Direction int xr = radius/2; byte c = (byte)0; int offset = 0; for(int row=0; row<height; row++) { for(int col=0; col<width; col++) { c = data[row*width+col]; if((c&0xff) == 0)continue; for(int x=-xr; x<=xr; x++) { if(x==0)continue; offset = x + col; if(offset < 0) { offset = 0; } if(offset >= width) { offset = width - 1; } c &=data[row*width+offset]; } if(c == 0){ output[row*width+col] = (byte)0; } } } System.arraycopy(output, 0, data, 0, size); // Y Direction int yr = radius/2; c = 0; offset = 0; for(int col=0; col<width; col++) { for(int row=0; row<height; row++) { c = data[row*width+col]; if((c&0xff) == 0)continue; for(int y=-yr; y<=yr; y++) { if(y == 0)continue; offset = y + row; if(offset < 0) { offset = 0; } if(offset >= height) { offset = height - 1; } c &=data[offset*width+col]; } if(c == 0){ output[row*width+col] = (byte)0; } } } System.arraycopy(output, 0, data, 0, size);}
基于传统卷积腐蚀算法代码实现:
@Overridepublic void process(int width, int height) { int size = width*height; byte[] output = new byte[size]; IntIntegralImage grayii = new IntIntegralImage(); grayii.setImage(data); grayii.process(width, height); int yr = radius/2; int xr = radius/2; System.arraycopy(data, 0, output, 0, size); byte c = 0; int nx=0, ny=0; for(int row=0; row<height; row++) { for(int col=0; col<width; col++) { c = data[row*width+col]; if(c == 0)continue; for(int y=-yr; y<=yr; y++) { ny = y + row; if(ny < 0 || ny >= height){ ny = 0; } for(int x=-xr; x<=xr; x++) { nx = x+col; if(nx < 0 || nx >= width) { nx = 0; } c &= data[ny*width+nx]&0xff; } } if(c == 0) { output[row*width+col] = (byte)0; } } } System.arraycopy(output, 0, data, 0, size);}
三:耗时比较
对张大小为381x244大小二值图像一维快速与传统腐蚀操作耗时比较结果如下(Win64,CPU i5, JDK8 64位):
原图与对应不同结构元素大小腐蚀结果如下:
无论是卷积还是高斯模糊,还是形态学操作,理论上都是卷积计算,但是在实际编码过程中基于对计算耗时考虑都是进行了各种有效变换从而提高计算速度与减少执行时间,所以对于任何看似简单的图像操作,理论一旦脱离实践!长期如此的结果就是眼高手低! 愿与各位共勉!祝各位五一劳动节快乐!
- 动态规划
- 如何使用MVP+Dagger2+RxJava+Retrofit开发(1)
- 蓝牙门禁Android客户端
- Java直接(堆外)内存使用详解
- Html再学
- com.android.ddmlib.InstallException: Unable to upload some APKs?
- GET/POST/g和钩子函数(hook)
- cookie和session
- Python Flask模块
- Java直接内存与非直接内存性能测试
- Elasticsearch——multi termvectors的用法
- Elasticsearch增删改查 之 —— Delete删除
- Elasticsearch增删改查 之 —— Get查询
- 实现两个N*N矩阵的乘法,矩阵由一维数组表示
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 小姐姐提灯给你讲讲动态规划(万字长文)
- 解决fedora启动时显示cannot open font file true的办法 By HKL,
- 盘点 6 个被淘汰的 Java 技术,它们都曾经风光过!
- Unlock a VBA password protected Excel file By HKL,
- kde安装gtk主题(kde-gtk-theme)KDE4下gtk程序美化 By HKL,
- Monkey's Audio vs. WavPack vs. FLAC By HKL,
- 彻底屏蔽优酷广告 By HKL, Monday 12 Au
- C# 如何给Winform的button等控件添加快捷键 By HKL,
- kmskeys10 By HKL, Saturday 7
- C# Random 生成不重复随机数 By HKL, We
- Resin4配置 By HKL, Thursday 11
- 从源码编译N(ginx)+M(ySQL)+P(HP)并安装WordPress By HKL,
- MPEG4视频中,I帧、p帧、B帧的判定(转载) By HKL,
- 使用attrib命令解决存储器中毒后文件夹被隐藏的方法 By HKL,
- 在Archlinux上通过qemu运行ReactOS By HKL,