鸟语天空
图像处理——二值腐蚀
post by:追风剑情 2022-4-1 11:32

集合A(输入图像)被集合B(结构元素)腐蚀,表示为 AΘB, 其定义为 AΘB={x:B+x⊂A}

可见,AΘB由将B平移x仍包含在A内的所有点x组成。如果将B视为模板,那么AΘB则由在将模板平移的过程中,所有可填入A内部的模板的原点组成。

示例:数学形态学腐蚀图像

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

namespace ImageCorrosion
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Image image2 = Corrosion(pictureBox1.Image);
            pictureBox2.Image = image2;
        }

        //数学形态学—腐蚀图片
        private Image Corrosion(Image image)
        {
            //定义一个3x3的结构模板,原点[0,0]。
            int[,] templet = new int[,] { 
                { 1, 1, 1 }, 
                { 1, 1, 1 },
                { 1, 1, 1 }
            };
            Bitmap bmp = new Bitmap(image);
            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            Bitmap bmp_clone = bmp.Clone(rect, PixelFormat.Format24bppRgb);
            for (int y=0; y<bmp.Height; y++)
            {
                for (int x=0; x< bmp.Width; x++)
                {
                    Color c = bmp.GetPixel(x, y);
                    if (IsMatchTemplet(x, y, bmp, templet))
                    {
                        //保留此像素
                        bmp_clone.SetPixel(x,y,c);
                    }
                    else
                    {
                        //删除此像素(用背景色(黑色)进行腐蚀)
                        bmp_clone.SetPixel(x, y, Color.Black);
                    }
                }
            }
            return bmp_clone;
        }

        //判断模板所覆盖的图像区域与模板是否匹配
        //模板中1对应目标图像,0对应背景
        private bool IsMatchTemplet(int x, int y, Bitmap bmp, int[,] templet)
        {
            bool match = true;
            int rowLength = templet.GetLength(0);
            int colLength = templet.GetLength(1);
            for (int i=0; i<rowLength; i++)
            {
                if (y+i >= bmp.Height)
                {
                    match = false;
                    goto EXIT;
                }

                for (int j=0; j<colLength; j++)
                {
                    if (x+j >= bmp.Width)
                    {
                        match = false;
                        goto EXIT;
                    }

                    Color c = bmp.GetPixel(x+j, y+i);
                    //需要根据实际情况做判断,本示例仅判断R通道
                    int v = templet[i, j];
                    match = (c.R == 255 && v == 1) || (c.R == 0 && v == 0);
                    if (!match)
                        goto EXIT;
                }
            }
            EXIT:
            return match;
        }
    }
}

111111.png

评论:
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容