Win8Metro(C#)数字图像处理--2.25二值图像距离变换

简介: 原文:Win8Metro(C#)数字图像处理--2.25二值图像距离变换  [函数名称] 二值图像距离变换函数DistanceTransformProcess(WriteableBitmap src) [算法说明]  二值图像的距离变换实际上就是将二值图像转换为灰度图像,在二值图像中我们将图像分为目标图像和背景图像,假设目标图像像素值为1,即为白色,背景像素为0即为黑色。
原文: 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,Sum4Sum5,而中心像素值为这五个和值中的最小值。

 2,使用后向模板,对图像从下到上,从右到左进行扫描,方法同上。

 3,一般我们使用的模板为3*35*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);

       }

[图像效果]

目录
相关文章
|
9月前
|
算法 安全 机器人
Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的对数Log变换算法增强(C#)
Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的对数Log变换算法增强(C#)
84 0
Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的对数Log变换算法增强(C#)
|
9月前
|
算法 安全 机器人
Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的对数Log变换算法增强(C#)
Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的对数Log变换算法增强(C#)
52 0
|
10月前
|
C#
|
IDE 程序员 编译器
C#编程学习09:vs2015的windows窗体应用程序创建及英文界面变换为中文界面的方法
C#编程学习09:vs2015的windows窗体应用程序创建及英文界面变换为中文界面的方法
C#编程学习09:vs2015的windows窗体应用程序创建及英文界面变换为中文界面的方法
|
C#
【C#/WPF】图像变换的Undo撤销——用Stack命令栈
原文:【C#/WPF】图像变换的Undo撤销——用Stack命令栈 需求: 图层中有一张图片,可以对该图层进行平移、缩放、旋转操作,现在要求做Undo撤销功能,使得图层回复上一步操作时的状态。
843 0
|
C#
【C#/WPF】Image图片的Transform变换:平移、缩放、旋转
原文:【C#/WPF】Image图片的Transform变换:平移、缩放、旋转 WPF中图像控件Image的变换属性Transform: 平移 缩放 旋转 即要想实现图片的平移、缩放、旋转,是修改它所在的Image控件的Transform变换属性。
4767 0
|
C# 计算机视觉
Win8 Metro(C#) 数字图像处理--1 图像打开,保存
原文:Win8 Metro(C#) 数字图像处理--1 图像打开,保存 作为本专栏的第一篇,必不可少的需要介绍一下图像的打开与保存,一便大家后面DEMO的制作。
1128 0
|
算法 C# 计算机视觉
C#数字图像处理算法详解大全
原文:C#数字图像处理算法详解大全 C#数字图像处理算法详解大全 网址http://dongtingyueh.blog.
1489 0
|
算法 C# 计算机视觉
Win8Metro(C#)数字图像处理--2.3图像反色
原文:Win8Metro(C#)数字图像处理--2.3图像反色 [函数名称] 图像反色函数ContraryProcess(WriteableBitmap src) [算法说明]     反色公式如下:       P'(x,y) = 255 - P(x,y);     P'(x,y)为反色后的像素值,P(x,y)是原始像素值。
1088 0
|
算法 数据挖掘 C#
Win8Metro(C#)数字图像处理--2.4图像颜色聚类
原文:Win8Metro(C#)数字图像处理--2.4图像颜色聚类  [函数名称] 图像颜色聚类函数ClusterProcess(WriteableBitmap src,int value) [算法说明]   图像颜色聚类的方法有很多,但是对于视频监控而言,现有方法很难满足实时性的要求,这里介绍一种位屏蔽压缩的方法实现颜色聚类,可以满足实时性的要求。
1015 0