使用C# EmguCV 讀取圖片,並進行影像處理(灰階、二值化、侵蝕與膨脹)的影像範例

使用C# EmguCV 讀取圖片,並進行影像處理(灰階、二值化、侵蝕與膨脹)的影像範例

這個CASE是我在剛出社會時工作,在一間設備製造的供應商工作時所學到的技能,那時候的我雖然是電控專長但其實有關影像的內容學習的非常多

該廠商是製造並販售各種Laser Marking為主的機台。而我那時候的工作就是開發和維護控制雷射去打印PCB印刷電路板的程式

 

這篇文章的目的是在解決雷射打印時,因為素材以及雷射本身的功率速度和頻率,皆會影響打印在素材上的品質,有時候要控制這些原因是非常困難的。

所以除了要改善各種素材適應的雷射參數,也必須在影像處理的時候下些工夫,這個文章就是在述說解決雷射打印的2D Code(Data Matrix)讀取不良的問題。

雷射打印有很多種模式,這個案例的打印模式是Pulse Mode,你可以把它想像成很快速的點發子彈的打法,所以打印出來的Cell都會接近圓圓的一點,這在ECC 200的規範中,每個CELL要填滿該區域,才比較容易辨識,所以我使用的影像處理中的侵蝕和膨脹的方法來達成。

廢話不多說,如下就是範例程式碼與實際結果

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV.CvEnum;
using Emgu.CV;
using Emgu.CV.Structure;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //開啟檔案
            OpenFileDialog filename = new OpenFileDialog();
            if (filename.ShowDialog() == DialogResult.OK)
            {
                //將檔案路經存至Textbox1
                textBox1.Text = filename.FileName;
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            //將影像變型至400*400

            //讀取彩色影像
            Image<Bgr, byte> colorImage = new Image<Bgr, byte>(textBox1.Text);
            imageBox1.Image = colorImage;

            //取得灰階影像
            Image<Gray, byte> grayImage = new Image<Gray, byte>(colorImage.Bitmap);
            //grayImage.Save("gray.bmp");
            imageBox2.Image = grayImage;


            //二值化的閥值
            Gray thresholdValue = new Gray(55);
            //取得二值化影像
            Image<Gray, byte> thresholdImage = grayImage.ThresholdBinary(thresholdValue, new Gray(255));
            //thresholdImage.Save("threshold.bmp");
            imageBox3.Image = thresholdImage;


            //擴張處理(擴張1像素)
            Image<Gray, byte> ErodeImage = thresholdImage.Erode(1);
            imageBox4.Image = ErodeImage;

        }
    }
}