halcon 灰度和高通滤波

大家好,这里是石侃侃的博客,这篇文章介绍了使用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"

这是我的示例程序 贴在按键消息里就能运行 ,它会打开color.jpg并进行滤波处理
	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());

运行一下,灰度图像就出来了 


图片变成了我们期望的样子

结语 : 这方面的工作需要不错的数学功底和信号知识,每前进一步都要接收大量知识,但是我相信坚持下来,明天会更好!

猜你喜欢

转载自blog.csdn.net/zxpcus/article/details/80143722
今日推荐