图像处理之距离变换

概述

距离变换是二值图像处理与操作中常用手段,在骨架提取,图像窄化中常有应用。距离

变换的结果是得到一张与输入图像类似的灰度图像,但是灰度值只出现在前景区域。并

且越远离背景边缘的像素灰度值越大。

基本思想

根据度量距离的方法不同,距离变换有几种不同的方法,假设像素点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距离变换,图像处理之距离变换相关推荐

  1. 【图像处理】——距离变换算法

    前言 通过本文可以了解到 什么是图像的距离? 什么是距离变换 距离变换的计算 OpenCV中距离变换的实现 什么是图像的距离? 距离(distance)是描述图像两点像素之间的远近关系的度量,常见的度 ...

  2. matlab练习程序(Log Polar变换)

    Log Polar就是所谓的极坐标变换,通过变换能将笛卡尔坐标系中的图像映射到极坐标系中. 确切的来说我这里不算是Log Polar,因为Log Polar是将图像从(x,y)映射到(log(r),t ...

  3. matlab kl变换函数,《数字图像KL变换》PPT课件.ppt

    <<数字图像KL变换>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<数字图像KL变换>PPT课件.ppt(18页珍藏版)>请在人人文库网上搜索 ...

  4. 图像处理之Hadamard变换和Hough变换

    一.Hadamard变换 1.基本原理 Hadamard变换相当于在原来的图像矩阵左右分别乘以一一个矩阵,这两个矩阵都是正交矩阵,称为Hadamard变换矩阵.Hadamard变换矩阵中所有的元素都是 ...

  5. 【Matlab答题卡识别】hough变换答题卡判定与成绩统计【含GUI源码 752期】

    一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计[含GUI源码 752期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [ ...

  6. 【Matlab答题卡识别】hough变换答题卡判定与成绩统计(带面板)【含GUI源码 1017期】

    一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计(带面板)[含GUI源码 1017期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 ...

  7. dct变换和量化matlab,matlab实验,图像变换域分析(dct变换和小波变换)

    实验一 图像DCT变换 一.实验目的 1.了解DCT处理图像的基本知识: 2.掌握用matlab将对图像进行DCT变换.. 二.实验内容 1.对图像进行DCT处理: 2.显示变换后的图像的三维的频谱: ...

  8. OpenCV图像处理基础(变换和去噪)

    OpenCV图像处理基础(变换和去噪) 基础知识 使用OpenCV读取图片 图像变换 仿射变换 图像缩放 图像旋转 图像平移 图像裁剪 图像翻转 亮度与对比度变换 图像去噪 高斯噪声 椒盐噪声 中值和 ...

  9. 图像处理-007形态变换(二)

    图像处理-007形态变换(二) Hit-and-Miss Transform(击中击不中) Hit-and-Miss从二值图像中查找前景色/背景色的特定模式非常有用,与腐蚀,膨胀使用的kernel仅存 ...

  10. 数字图像处理--傅里叶(逆)变换

    数字图像处理–傅里叶(逆)变换 主要内容 (1)对一副图像进行缩放,显示原始图像和缩放后的图像,分别对其进行傅里叶变换,显示变换后结果: (2)对一副图像进行旋转,显示原始图像和旋转后的图像,分别对其 ...

最新文章

  1. 删除取消 excel 2007 自动生成的超链接
  2. Leetcode中Path的题目总结
  3. SpringCloud-Eureka-服务注册是如何发起的
  4. css垂直居中如何实现
  5. [Leedcode][JAVA][第1248题][统计「优美子数组][找规律]
  6. Sqring核心概念
  7. vue echarts动态数据定时刷新
  8. javascript document.cookie
  9. 锐捷校园网自动认证路由脚本
  10. VMware GSX Server 3.2.1 Build 19281免费下载
  11. 分享一个MAC下绕开百度网盘限速下载的方法,三步操作永久生效
  12. 分布式 HTAP 数据库 ADB PG 架构解析
  13. 让更多的学生掌握“元知识”才是大学的使命
  14. Android源码阅读工具AndroidXRef使用说明
  15. 【干货】MySQL底层架构设计,你了解多少?
  16. java单步跳入单步跳过_Eclipse 单步调试
  17. python pandas excel 排序_python – Pandas – 使用datetimeindex对数据帧进行排序
  18. win10应用商店linux,Ubuntu 20.04 LTS已可通过Windows 10应用商店获取
  19. 某某区电子政务平台需求工程方法建议
  20. 【蓝桥杯】Java_B组2017年省赛真题

热门文章

  1. 一个手机号码可以申请二个微信号吗?如何申请?
  2. QQ群推广最大化营销效果分析
  3. 智慧城市行业领军企业一览表
  4. OpenCV-绘制圆角矩形
  5. CF1680F Lenient Vertex Cover题解
  6. 过年了,想窝在家里把这些黑客电影都看完(附剧情简介和评分)
  7. ps怎么撤销参考线_ps里怎么把参考线去掉
  8. 微软的teredo服务器,win10系统通过teredo连接ipv6的操作方法
  9. Linux应该怎么快速学习?首推这份全网爆火的“Linux速成笔记”,阿里架构师都在用它!
  10. MATLAB(1)---将mat文件转换为csv文件