在评价图像清晰度的时候,需要同一个场景,拍多张图像做对比,才可以找出最清晰的一张。
可以参考halcon的以下例程,直接搜索关键词sharpness查找。
里面看起来流程会比较多,实测可以使用关键算子intensity,基本可以满足要求 。
这里使用了20张左右的图像做了测试,代码如下:
dev_set_draw ('margin')
dev_set_color ('red')
ImageFiles:='./测试图像清晰度/'
list_image_files (ImageFiles, 'default', [], ImageFiles1)
Ret1:=[]
for Index := 1 to |ImageFiles1| by 1
*注意图片名称,这种$'02d'写法的含义是把数字转换为2位的意思,
*整体含义是在当前工程目录下,名为测试图像清晰度的文件夹里面,名称为01,02,03.....的图片。
name:=ImageFiles+(Index)$'02d'
*读入图片
read_image (Image, name)
*计算区域内图像灰度值的均值和偏差。
*参数1.输入的区域,如果输入的是图像,则会自动使用区域对应的图像。
*参数2.输入的图像。
*参数3.区域的平均灰度值。区域内所有像素的灰度值之和,再除以像素个数,得到平均灰度值。
*参数4.一个区域内灰度值的偏差。具体公式可以按F1参考帮助文档。此值越大越清晰。
intensity (Image, Image, Value1, DeviationTest)
*把偏差值存入到数组。
Ret1:=[Ret1,DeviationTest]
endfor
*在数组里面找到偏差值最大的索引,也是峰值最大,对应的最清晰的那张。
qxd1:=find(Ret1,max(Ret1))
*读入识别到的清晰度最高的图片。由于索引从0开始,所以需要加1。
read_image (GoodImage, ImageFiles+(qxd1+1)$'02d')
dev_display (GoodImage)
dev_get_window (WindowHandle)
X:=[1:1:|Ret1|]
*显示曲线图
plot_tuple (WindowHandle,X, Ret1, '图像序列', '灰度值偏差', 'red', [], [])
stop()
可以自己采集一系列图片实测,也可以找到例程里面使用的图片文件夹测试。