matlab距离变换,图像处理之距离变换
图像处理之距离变换
概述
距离变换是二值图像处理与操作中常用手段,在骨架提取,图像窄化中常有应用。距离
变换的结果是得到一张与输入图像类似的灰度图像,但是灰度值只出现在前景区域。并
且越远离背景边缘的像素灰度值越大。
基本思想
根据度量距离的方法不同,距离变换有几种不同的方法,假设像素点p1(x1, y1),
p2(x2, y2)计算距离的方法常见的有:
1. 欧几里德距离,Distance =
2. 曼哈顿距离(City Block Distance),公式如下:Distance = |x2-x1|+|y2-y1|
3. 象棋格距离(Chessboard Distance),公式如下:Distance = max(|x2-x1|,|y2-y1|)
一旦距离度量公式选择,就可以在二值图像的距离变换中使用。一个最常见的距离变换
算法就是通过连续的腐蚀操作来实现,腐蚀操作的停止条件是所有前景像素都被完全
腐蚀。这样根据腐蚀的先后顺序,我们就得到各个前景像素点到前景中心骨架像素点的
距离。根据各个像素点的距离值,设置为不同的灰度值。这样就完成了二值图像的距离
变换。
注意点:
腐蚀操作结构体的选取会影响距离变换的效果,例子使用3*3的矩阵完成。有很多快速
的距离变换算法,感兴趣的可以自己研究。
运行结果:
关键代码解析:
初始化二值图像,读取像素,获取前景边缘像素与背景边缘像素
public DistanceTransform(float scaleValue, float offsetValue, BufferedImage src) { this.scaleValue = scaleValue; this.offsetValue = offsetValue; this.inputImage = src; this.width = src.getWidth(); this.height = src.getHeight(); int[] inPixels = new int[width*height]; getRGB( src, 0, 0, width, height, inPixels ); int index = 0; pixels2D = new int[height][width]; // row, column greyLevel = new int[height][width]; for(int row=0; row < height; row++) { for(int col=0; col> 16) & 0xff; pixels2D[row][col] = grayValue; greyLevel[row][col] = 0; } } generateForegroundEdge(); generateBackgroundEdgeFromForegroundEdge(); }现实距离变换的代码如下:
@Override public BufferedImage filter(BufferedImage src, BufferedImage dest) { // calculate the distance here!! int index = 1; while (foregroundEdgePixels.size() > 0) { distanceSingleIteration(index); ++index; } // loop the each pixel and assign the color value according to distance value for (int row = 0; row < inputImage.getHeight(); row++) { for (int col = 0; col < inputImage.getWidth(); col++) { if(greyLevel[row][col] > 0) { int colorValue = (int)Math.round(greyLevel[row][col] * scaleValue + offsetValue); colorValue = colorValue > 255 ? 255 : ((colorValue < 0) ? 0 : colorValue); this.pixels2D[row][col] = colorValue; } } } // build the result pixel data at here !!! if ( dest == null ) dest = createCompatibleDestImage(inputImage, null ); index = 0; int[] outPixels = new int[width*height]; for(int row=0; row 60) { System.out.println("ddddd"); } index = row * width + col; tr = tg = tb = this.pixels2D[row][col]; ta = 255; outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb; } } setRGB( dest, 0, 0, width, height, outPixels ); return dest; }生成前景边缘像素与背景边缘像素的代码如下:
private void generateForegroundEdge() { foregroundEdgePixels.clear(); for (int row = 0; row < height; row++) for (int col = 0; col < width; col++) if (this.pixels2D[row][col] == foreground) { Point localPoint = new Point(col, row); for (int k = -1; k < 2; ++k) // 3*3 matrix for (int l = -1; l < 2; ++l) { if ((localPoint.x + l < 0) || (localPoint.x + l >= this.width) || (localPoint.y + k < 0) || (localPoint.y + k >= this.height) || (this.pixels2D[(localPoint.y + k)][(localPoint.x + l)] != background) || (this.foregroundEdgePixels.contains(localPoint))) continue; this.foregroundEdgePixels.add(localPoint); } } } private void generateBackgroundEdgeFromForegroundEdge() { this.backgroundEdgePixels.clear(); Iterator localIterator = this.foregroundEdgePixels.iterator(); while (localIterator.hasNext()) { Point localPoint1 = new Point((Point)localIterator.next()); for (int i = -1; i < 2; ++i) for (int j = -1; j < 2; ++j) if ((localPoint1.x + j >= 0) && (localPoint1.x + j < this.width) && (localPoint1.y + i >= 0) && (localPoint1.y + i < this.height)) { Point localPoint2 = new Point(localPoint1.x + j, localPoint1.y + i); if (this.pixels2D[localPoint2.y][localPoint2.x] == background) this.backgroundEdgePixels.add(localPoint2); } } }
matlab距离变换,图像处理之距离变换相关推荐
- 【图像处理】——距离变换算法
前言 通过本文可以了解到 什么是图像的距离? 什么是距离变换 距离变换的计算 OpenCV中距离变换的实现 什么是图像的距离? 距离(distance)是描述图像两点像素之间的远近关系的度量,常见的度 ...
- matlab练习程序(Log Polar变换)
Log Polar就是所谓的极坐标变换,通过变换能将笛卡尔坐标系中的图像映射到极坐标系中. 确切的来说我这里不算是Log Polar,因为Log Polar是将图像从(x,y)映射到(log(r),t ...
- matlab kl变换函数,《数字图像KL变换》PPT课件.ppt
<<数字图像KL变换>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<数字图像KL变换>PPT课件.ppt(18页珍藏版)>请在人人文库网上搜索 ...
- 图像处理之Hadamard变换和Hough变换
一.Hadamard变换 1.基本原理 Hadamard变换相当于在原来的图像矩阵左右分别乘以一一个矩阵,这两个矩阵都是正交矩阵,称为Hadamard变换矩阵.Hadamard变换矩阵中所有的元素都是 ...
- 【Matlab答题卡识别】hough变换答题卡判定与成绩统计【含GUI源码 752期】
一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计[含GUI源码 752期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [ ...
- 【Matlab答题卡识别】hough变换答题卡判定与成绩统计(带面板)【含GUI源码 1017期】
一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计(带面板)[含GUI源码 1017期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 ...
- dct变换和量化matlab,matlab实验,图像变换域分析(dct变换和小波变换)
实验一 图像DCT变换 一.实验目的 1.了解DCT处理图像的基本知识: 2.掌握用matlab将对图像进行DCT变换.. 二.实验内容 1.对图像进行DCT处理: 2.显示变换后的图像的三维的频谱: ...
- OpenCV图像处理基础(变换和去噪)
OpenCV图像处理基础(变换和去噪) 基础知识 使用OpenCV读取图片 图像变换 仿射变换 图像缩放 图像旋转 图像平移 图像裁剪 图像翻转 亮度与对比度变换 图像去噪 高斯噪声 椒盐噪声 中值和 ...
- 图像处理-007形态变换(二)
图像处理-007形态变换(二) Hit-and-Miss Transform(击中击不中) Hit-and-Miss从二值图像中查找前景色/背景色的特定模式非常有用,与腐蚀,膨胀使用的kernel仅存 ...
- 数字图像处理--傅里叶(逆)变换
数字图像处理–傅里叶(逆)变换 主要内容 (1)对一副图像进行缩放,显示原始图像和缩放后的图像,分别对其进行傅里叶变换,显示变换后结果: (2)对一副图像进行旋转,显示原始图像和旋转后的图像,分别对其 ...
最新文章
- 删除取消 excel 2007 自动生成的超链接
- Leetcode中Path的题目总结
- SpringCloud-Eureka-服务注册是如何发起的
- css垂直居中如何实现
- [Leedcode][JAVA][第1248题][统计「优美子数组][找规律]
- Sqring核心概念
- vue echarts动态数据定时刷新
- javascript document.cookie
- 锐捷校园网自动认证路由脚本
- VMware GSX Server 3.2.1 Build 19281免费下载
- 分享一个MAC下绕开百度网盘限速下载的方法,三步操作永久生效
- 分布式 HTAP 数据库 ADB PG 架构解析
- 让更多的学生掌握“元知识”才是大学的使命
- Android源码阅读工具AndroidXRef使用说明
- 【干货】MySQL底层架构设计,你了解多少?
- java单步跳入单步跳过_Eclipse 单步调试
- python pandas excel 排序_python – Pandas – 使用datetimeindex对数据帧进行排序
- win10应用商店linux,Ubuntu 20.04 LTS已可通过Windows 10应用商店获取
- 某某区电子政务平台需求工程方法建议
- 【蓝桥杯】Java_B组2017年省赛真题
热门文章
- 一个手机号码可以申请二个微信号吗?如何申请?
- QQ群推广最大化营销效果分析
- 智慧城市行业领军企业一览表
- OpenCV-绘制圆角矩形
- CF1680F Lenient Vertex Cover题解
- 过年了,想窝在家里把这些黑客电影都看完(附剧情简介和评分)
- ps怎么撤销参考线_ps里怎么把参考线去掉
- 微软的teredo服务器,win10系统通过teredo连接ipv6的操作方法
- Linux应该怎么快速学习?首推这份全网爆火的“Linux速成笔记”,阿里架构师都在用它!
- MATLAB(1)---将mat文件转换为csv文件