Win8Metro(C#)数字图像处理--2.25二值图像距离变换
原文:Win8Metro(C#)数字图像处理--2.25二值图像距离变换
[函数名称]
二值图像距离变换函数DistanceTransformProcess(WriteableBitmap
src)
[算法说明]
二值图像的距离变换实际上就是将二值图像转换为灰度图像,在二值图像中我们将图像分为目标图像和背景图像,假设目标图像像素值为1,即为白色,背景像素为0即为黑色。在转换后的幅灰度图像中,每个连通域的各个像素点的灰度级与该像素点到其背景像素的最近距离有关。其中灰度级最大点的集合为目标图像的骨架,就是目标图像中心部分的像素的集合,灰度级反应了背景像素与目标图像边界的影响关系。用数学语言表示如下:
假设二值图像I包含一个连通域S,其中有目标O和背景B,距离图为D,则距离变换定义如下:
距离变换的具体步骤为:
1,将图像中的目标像素点分类,分为内部点,外部点和孤立点。
以中心像素的四邻域为例,如果中心像素为目标像素(值为1)且四邻域都为目标像素(值为1),则该点为内部点。如果该中心像素为目标像素,四邻域为背景像素(值为0),则该中心点为孤立点,如下图所示。除了内部点和孤立点之外的目标区域点为边界点。
6,对于孤立点保持不变。
以上的距离变换方法由于计算量大,比较耗时,因此在实际应用中,我们采用一种倒角模版算法,只需要对图像进行两次扫描就可以实现距离变换。该方法称为Chamfer倒角距离变换法。
该方法使用两个模版,分别为前向模版和后向模板,如下图所示:
计算步骤如下:
1,使用前向模板,对图像从上到下,从左到右进行扫描,模板中心0点对应的像素值如果为0则跳过,如果为1则计算模板中每个元素与其对应的像素值的和,分别为Sum1,Sum2,Sum3,Sum4,Sum5,而中心像素值为这五个和值中的最小值。
2,使用后向模板,对图像从下到上,从右到左进行扫描,方法同上。
3,一般我们使用的模板为3*3和5*5,分别如下图所示:
[函数代码]
///<summary>
///
Distance transform of binary image.
///</summary>
///<param
name="src">The source image.</param>
///<returns></returns>
publicstaticWriteableBitmap
DistanceTransformProcess(WriteableBitmap src)////25二值图像距离变换
{
if
(src !=null)
{
int
w = src.PixelWidth;
int
h = src.PixelHeight;
WriteableBitmap
expansionImage =newWriteableBitmap(w,
h);
byte[]
temp = src.PixelBuffer.ToArray();
int
t1, t2, t3, t4, t5, min = 0;
for
(int y = 0; y < h; y++)
{
for
(int x = 0; x < w * 4 - 4; x += 4)
{
if
(y == 0 || x == 0)
{
temp[x + y * w * 4] = 0;
temp[x + 1 + y * w * 4] = 0;
temp[x + 2 + y * w * 4] = 0;
}
else
{
if
(temp[x + y * w * 4] != 0)
{
t1 = temp[x - 3 + (y - 1) * w * 4] + 4;
t2 = temp[x + (y - 1) * w * 4] + 3;
t3 = temp[x + 3 + (y - 1) * w * 4] + 4;
t4 = temp[x - 3 + y * w * 4] + 3;
t5 = temp[x + y * w * 4];
min = GetMin(t1, t2, t3, t4, t5);
temp[x + y * w * 4] = (byte)min;
temp[x + 1 + y * w * 4] = (byte)min;
temp[x + 2 + y * w * 4] = (byte)min;
}
t2 = 0; t3 = 0; t4 = 0; t5 = 0; min = 0;
}
}
}
for
(int y = h - 2; y > 0; y--)
{
for
(int x = w * 4 - 4; x > 0; x -= 4)
{
if
(y == 1 || x == 3)
{
temp[x + y * w * 4] = 0;
temp[x + 1 + y * w * 4] = 0;
temp[x + 2 + y * w * 4] = 0;
}
else
{
if
(temp[x + y * w * 4] != 0)
{
t1 = temp[x - 3 + (y + 1) * w * 4] + 4;
t2 = temp[x + (y + 1) * w * 4] + 3;
t3 = temp[x + 3 + (y + 1) * w * 4] + 4;
t4 = temp[x + 3 + y * w * 4] + 3;
t5 = temp[x + y * w * 4];
min = GetMin(t1, t2, t3, t4, t5);
temp[x + y * w * 4] = (byte)min;
temp[x + 1 + y * w * 4] = (byte)min;
temp[x + 2 + y * w * 4] = (byte)min;
}
t2 = 0; t3 = 0; t4 = 0; t5 = 0; min = 0;
}
}
}
Stream
sTemp = expansionImage.PixelBuffer.AsStream();
sTemp.Seek(0,
SeekOrigin.Begin);
sTemp.Write(temp, 0, w * 4 * h);
return
expansionImage;
}
else
{
returnnull;
}
}
privatestaticint
GetMin(int a,
int b,int
c,int d,int
e)
{
int
t = (a < b ? a : b) < c ? (a < b ? a : b) : c;
return
((t < d ? t : d) < e ? (t < d ? t : d) : e);
}
[图像效果]
Win8Metro(C#)数字图像处理--2.25二值图像距离变换的更多相关文章
- Win8Metro(C#)数字图像处理--2.24二值图像闭运算
原文:Win8Metro(C#)数字图像处理--2.24二值图像闭运算 [函数名称] 二值图像闭运算函数CloseOperateProcess(WriteableBitmap src) [算法说 ...
- Win8Metro(C#)数字图像处理--2.22二值图像膨胀
原文:Win8Metro(C#)数字图像处理--2.22二值图像膨胀 [函数名称] 二值图像膨胀函数DilationProcess(WriteableBitmap src) [算法说明] 膨胀 ...
- Win8Metro(C#)数字图像处理--2.23二值图像开运算
原文:Win8Metro(C#)数字图像处理--2.23二值图像开运算 [函数名称] 二值图像开运算函数OpenOperateProcess(WriteableBitmap src) [算法说明 ...
- Win8Metro(C#)数字图像处理--2.21二值图像腐蚀
原文:Win8Metro(C#)数字图像处理--2.21二值图像腐蚀 [函数名称] 二值图像腐蚀函数CorrosionProcess(WriteableBitmap src) [算法说明] 二值 ...
- Win8Metro(C#)数字图像处理--2.33图像非线性变换
原文:Win8Metro(C#)数字图像处理--2.33图像非线性变换 [函数名称] 图像非线性变换函数NonlinearTransformProcess(WriteableBitmap src ...
- Win8Metro(C#)数字图像处理--2.40二值图像轮廓提取
http://dongtingyueh.blog.163.com/blog/static/4619453201271481335630/ [函数名称] 二值图像轮廓提取 Contour ...
- Win8Metro(C#)数字图像处理--2.34直方图规定化
原文:Win8Metro(C#)数字图像处理--2.34直方图规定化 [函数名称] WriteableBitmap HistogramSpecificateProcess(WriteableBi ...
- Win8Metro(C#)数字图像处理--2.30直方图均衡化
原文:Win8Metro(C#)数字图像处理--2.30直方图均衡化 [函数名称] 直方图均衡化函数HistogramEqualProcess(WriteableBitmap src) [算法说明] ...
- Win8Metro(C#)数字图像处理--2.31灰度拉伸算法
原文:Win8Metro(C#)数字图像处理--2.31灰度拉伸算法 [函数名称] 灰度拉伸函数GrayStretchProcess(WriteableBitmap src) [算法说明] ...
随机推荐
- poj 2594 Treasure Exploration 二分图匹配
点击打开链接题目链接 Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 7215 ...
- BFKit:对常用 UIButton,UIColor,UIDevice,UIFont ,UIImage 等开发类进行了扩展
BFKit对常用于开发的类进行了扩展,整合了多个常用的控件和开发所需要的功能,是一个通用性的类库.集成后可以帮助更快的App开发.有兴趣的同学可以看看哦. http://code4app.com/io ...
- Linux四个常用的指挥机关处理具体的解释
原版的Blog.转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=contents 权限 对于文件 r 可读 w 可写 x 可运行 对于文件夹 r 能够列 ...
- mongose TypeError: Cannot read property 'findOne' of undefined
最近在node的一个项目中,需要在model的一个数据表中写一个钩子函数去调用另外一个文件中的方法,一开始我采用了将此方法放入到global中,直接从global.meteod这样去获取.后来我又尝试 ...
- win10 uwp 使用 msbuild 命令行编译 UWP 程序
原文:win10 uwp 使用 msbuild 命令行编译 UWP 程序 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http:// ...
- Codeforces 85B. Embassy Queue【段树、馋】
标题效果: 每个人都应该申请签证必须向大使馆3种程序,而这3个步骤做的顺序是固定的.通过各种形式的手续给出多少,它需要对每个过程的处理时间,有多少人会来办理手续,什么时间来.要求的是全部人分别在大使馆 ...
- Dictionary(数据字典)
数据字典:Dictionary对象用于在结对的名称/值中存储信息(等同于键和项目),其可作为传参使用. C# Dictionary字典类的使用方法 //定义字典 Dictionary<strin ...
- CUDA线程协作之共享存储器“__shared__”&&“__syncthreads()”
在GPU并行编程中,一般情况下,各个处理器都需要了解其他处理器的执行状态,在各个并行副本之间进行通信和协作,这涉及到不同线程间的通信机制和并行执行线程的同步机制. 共享内存"__share_ ...
- R 语言基本操作(基本信息的查看、与本地文件系统交互、编译器版本升级)
0. 信息及路径的查看 getwd() ⇒ 查看路径: setwd() ⇒ 设置路径: .libPaths() ⇒ R 语言库所在的位置: sessionInfo() ⇒ 查询版本及系统和库等信息: ...
- Websphere设备、企业部署应用程序 【应用】
Websphere设备.企业部署应用实例 环境 名称 版本号 Linux系统 CentOS-5.6-x86_64 Oracle软件 10201_database_linux_x86_64.cpio W ...