在上篇文章中已经实现了在C#中成功调用Halcon,今天来实现阈值分割,并且利用简单的封装来优化自己的阈值分割方法。
一、前期准备![](https://i-blog.csdnimg.cn/direct/67df38f0d3b945d9a68e2ecca2ebbfd3.png)
创建好工程后,设计一个基本的框架UI(不会创建工程的同志以及没搭好环境的同学,可以看我上一篇),这里我用了两个按钮(button)两个标签(Label)两个文本框(Textbox)和一个窗口(HWindowControl)。
如果没有HWindowControl窗口的话,需要重新将文件拖入工具箱(具体可看上一篇文章)。
下图是两个按钮以及窗口的相关属性,可自行根据需求改变属性。
二、初步实现
下面我们开始初步实现c#中实现阈值分割。
第一步,实现读取图片的按钮功能(Button_readImage)
在UI界面,双击“Button_readImage”按钮后,可以自己跳转到对应的cs下并生成函数。
//定义一个图片的成员变量
private HObject ho_image;
private void button_readImage_Click(object sender, EventArgs e)
{
//写入想要读取图片的路径,这里为方便演示写死了图片路径
HOperatorSet.ReadImage(out ho_image, "C:\\Users\\86186\\Desktop\\BackgroundImage\\P0.jpg");
HTuple width, height;
//获得图片的宽和高
HOperatorSet.GetImageSize(ho_image, out width, out height);
//设置图片在窗口的显示范围,HWindowControl.HalconWindow -->控件的句柄
HOperatorSet.SetPart(hWindowControl_First,0,0(height-1),(width-1));
//显示
HOperatorSet.DispObj(ho_image, hWindowControl_First.HalconWindow);
}
写完这段代码,我们来运行,检查一下按钮功能是否能正常实现。
当图片加载出来后,验证了图片加载功能是成功的。下面开始实现阈值分割功能,先来实现最基础的阈值分割。
HTuple MinGray;
HTuple MaxGray;
private void button_threshold_Click(object sender, EventArgs e)
{
//设置窗口清除,这样可以防止上一次的图像遮盖
hWindowControl_First.HalconWindow.ClearWindow();
//设置判断语句,防止没有读取图片,就进行阈值分割的操作。
if (ho_image == null)
{
button_readImage_Click(null, null);
}
//设置阈值分割后显示的颜色
HOperatorSet.SetColor(hWindowControl_First.HalconWindow, "red");
HObject Region;
//int.Parse(string)强制字符串类型转化成int类型
MaxGray = int.Parse(textBox_MaxGray.Text);
MinGray = int.Parse(textBox_MinGray.Text);
//阈值分割
HOperatorSet.Threshold(ho_image,out Region ,MinGray,MaxGray);
HTuple width,height;
HOperatorSet.GetImageSize(ho_image,out width,out height);
HOperatorSet.SetPart(hWindowControl_First.HalconWindow, 0, 0, (height - 1),(width - 1));
HOperatorSet.DispObj(Region, hWindowControl_First.HalconWindow);
}
来看一下,我们初步实现阈值分割的整体效果。首先,读取图片。
输入最大,最小值后点击阈值分割
测试成功!