大家好,这里是石侃侃的博客,这篇文章介绍了使用halcon对图片简单处理的方法
/*************************************更新于2018.5.3********************************************************************/
DynThreshold的结果来看作用应该是取二值化,而不是高通滤波,在此更正
/*********************************************************************************************************************/
一、平滑滤波(和高通滤波配合使用) :
MedianImage - 一个中值过滤器。
void MedianImage(const HObject& Image,HObject * ImageMedian,const HTuple& MaskType,const HTuple& Radius,const HTuple& Margin)
参数Image(input_object) 要过滤的图像。
ImageMedian() 已过滤的图像。
MaskType 过滤掩码类型。
Radius 过滤器的半径。
默认值: 1
值列表(针对计算设备): 1,2
建议值: 1,2,3,4,5,6,7,8,9,11,15,19,25,31,39,47,59
典型值范围:1≤ ≤4095 半径
Margin 余量
默认值:"mirrored"
值列表:"mirrored"
建议值: "mirrored", "cyclic", "continued", 0, 30, 60, 90, 120, 150, 180, 210, 240, 255
示例(HDevelop)read_image(Image,'fabrik') median_image(Image,Median,'circle',3,'continued') dev_display(Median)
二、高通滤波
void DynThreshold(const HObject& OrigImage,const HObject& ThresholdImage,HObject * RegionDynThresh,const HTuple& Offset,const HTuple& LightDark)
简单来说 可以提取对象的轮廓 凸显边缘,模糊内部;低通滤波 模糊边缘
参数
OrigImage 输入图像。
ThresholdImage包含本地阈值的图像
RegionDynThresh 分段区域。(输出结果)
RegionDynThresh偏移应用于ThresholdImage。
默认值: 5.0
建议值: 1.0,3.0,5.0,7.0,10.0,20.0,30.0
典型值范围:-255.0≤ ≤255.0 抵消 (lin)
最小增量: 0.01
建议增量: 5
限制:-255 <偏移&&偏移<255
LightDark
提取光线,黑暗或类似区域?
默认值:"light"
值的列表:"dark", "equal", "light", "not_equal"
HObject ho_Image, ho_ImageMean, ho_DarkPixels;
HTuple hv_Width, hv_Height, hv_WindowHandle;
ReadImage(&ho_Image, "D:/color.jpg"); //baidu.png
GetImageSize(ho_Image, &hv_Width, &hv_Height);
dev_open_window_fit_image(ho_Image, 0, 0, hv_Width, hv_Height, &hv_WindowHandle);
//SetLineWidth(HDevWindowStack::GetActive(), 4);
//SetDraw(HDevWindowStack::GetActive(), "margin");
MeanImage(ho_Image, &ho_ImageMean,15 , 15); /* 通过平均平滑 平滑滤波 ho_ImageMean是输出*/
DynThreshold(ho_Image, ho_ImageMean, &ho_DarkPixels, 5, "equal"); /* ho_DarkPixels是输出 通过DynThreshold,可以提取对象的轮廓 */
DispObj(ho_DarkPixels, HDevWindowStack::GetActive());
color.jpg是这个样子
在高通滤波后得到 :
我们可以看到,经过滤波处理后,突出了边缘,模糊了内部
那么我们想转换成灰度图像该如何呢?
halcon为我们提供了Rgb1ToGray函数
参数void Rgb1ToGray(const HObject& RGBImage, HObject* GrayImage)
示例 :
HObject ho_Image, ho_ImageMean, ho_DarkPixels,GrayImage;
HTuple hv_Width, hv_Height, hv_WindowHandle;
//ReadImage(&ho_Image, "D:/monkey.png");
ReadImage(&ho_Image, "D:/color.jpg"); //baidu.png
GetImageSize(ho_Image, &hv_Width, &hv_Height);
dev_open_window_fit_image(ho_Image, 0, 0, hv_Width, hv_Height, &hv_WindowHandle);
Rgb1ToGray(ho_Image,&GrayImage);
DispObj(GrayImage, HDevWindowStack::GetActive());
运行一下,灰度图像就出来了
图片变成了我们期望的样子
结语 : 这方面的工作需要不错的数学功底和信号知识,每前进一步都要接收大量知识,但是我相信坚持下来,明天会更好!