使用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;
}
}
}