图像的腐蚀和膨胀

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图像的腐蚀和膨胀

研究背景和意义

依据数学形态学集合论方法发展起来的图像处理方法,在数字图像处理和机器视觉领域中得到了广泛的应用,形成了一种独特的数字图像分析和理论。数学形态学是图像处理和模式识别领域的新方法,其基本的思想是:用具有一定形态的结构元素去度量和提取图像中的对应形状,已达到图像分析和识别的目的。

优势有一下几点:有效滤除噪声,保留图像中原有信息,算法很容易用并行处理方法有效实现,基于数学形态学的边缘信息提取处理优于基于微分运算的边缘提取算法,提取的边缘比较平滑,提取的图像骨架也比较连续,断点很少。

二.原理

特殊领域运算形式——结构元素,在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。运算结果是输出图像的相应像素。运算效果取决于结构元素大小、内容以及逻辑运算性质。

结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小的多。二维平面结构元素由一个数值为0或1的矩阵组成。结构元素的原点(锚点)指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的领域像素在进行膨胀或腐蚀操作时是否需要参与计算。

常见的形态学运算有腐蚀和膨胀两种:

腐蚀:删除对象边缘某些像素。

膨胀:给图像中的对象边缘添加像素。

三.算法及效果图

膨胀算法:用3X3的结构元素扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为0,结果图像的该像素点为0,否则为1。膨胀算法的效果是使二值图像扩大一圈。

腐蚀的算法:用3X3的结构元素,扫描图像的每一个像素点,用结构元素与其覆盖的二值图像做“与”操作,如果结果都为1,结果图像的该像素点为1,否则为0。

膨胀算法的结果:是二值图像减少一圈。

四.组合使用效果

先腐蚀后膨胀的过程:利用它可以消除小物体,在纤细点处分离物体,平滑较大物体边界,但同时并不会明显改变原来物体的面积。

先膨胀后腐蚀的过程:利用它可以填充物体内细小空洞,连接临近物体、平滑其边界,但同时并不会明显改变原来物体的面积。

通常由于噪声的影响,图像在阈值化后所得到的边界通常都很不平滑,物体区域具有一些噪声孔,而背景区域上散布着一些小的噪声物体,连续的开和闭运算可以有效的改善这种情况。而有时,我们需要经过多次腐蚀,然后再加上相同次数的膨胀,才能产生比较好的处理效果。可见图像的腐蚀与膨胀相结合有时可以使图像有较理想的处理效果。

图像处理分为多种,对于不同的图像腐蚀和膨胀的定义不同。

1. 形态学图像处理是在图像中移动一个结构元素,然后将结构元素

与下面的二值图像进行交、并等集合运算;

先腐蚀后膨胀的过程称为开运算。

它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称为闭运算。

它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。

2. 对灰度图像的膨胀(或腐蚀)操作有两类效果:

(1)如果结构元素的值都为正的,则输出图像会比输入图像亮(或暗);

(2)根据输入图像中暗(或亮)细节的灰度值以及它们的形状相对于结构元素的关系,它们在运算中或被消减或被除掉。

using System;

using System.Collections.Generic;

using ponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Imaging;

using System.Runtime.InteropServices;

namespace WindowsFormsApplication2

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void LockUnlockBitsExample(PaintEventArgs e)

{

//Create a new bitmap

Bitmap bmp = new Bitmap("house.jpg");

//Lock the bitmap's bits

Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);

BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);

//Get the address of the fist line

IntPtr ptr = bmpData.Scan0;

//Declare an array to hold the bytes of the bitmap

int bytes = Math.Abs(bmpData.Stride) * bmp.Height;

byte[] rgbValues = new byte[bytes];

//Copy the RGB values into the array

Marshal.Copy(ptr, rgbValues, 0, bytes);

//Set every third value to 255. A 24bpp bitmap will look red

for (int counter = 2; counter < rgbValues.Length; counter += 3 ) {

rgbValues[counter] = 255;

}

//Copy the RGB values back to the bitmap

Marshal.Copy(rgbValues, 0, ptr, bytes);

//Unlock the bits

bmp.UnlockBits(bmpData);

//Draw the modified image

e.Graphics.DrawImage(bmp, 0, 150);

}

}

}

相关文档
最新文档