42、图像的清晰度计算

自动对焦要求相机根据拍摄环境和场景的变化,通过相机内部的微型驱动马达,自动调节相机镜头和CCD之间的距离,保证像平面正好投影到CCD的成像表面上。这时候物体的成像比较清晰,图像细节信息丰富。相机自动对焦的过程,其实就是对成像清晰度评价的过程。对焦不准确会造成图像模糊,在高精度视觉测量和视觉定位等应用中会带来误差。

工业相机上用的变焦镜头需要人为去调节到最清晰一个状态,以下分别提供方差法、拉普拉斯能量函数法、能量梯度函数法、Brenner函数法的评判来找到最清晰的图像。

主函数

*使用halcon自带的图片

*实现了五种评价函数,

*选择算子的Method值,可以观察不同评价函数的效果。

read_image (Image, 'pcb_focus/pcb_focus_telecentric_106')

dev_update_off ()

dev_close_window ()

dev_open_window_fit_image (Image, 0, 0, 752, 480, WindowHandle)

set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

dev_set_color ('lime green')

dev_set_line_width (3)

Ret:=[]

get_image_size(Image, Width, Height)

for Index := 1 to 121 by 1

read_image (Image, 'pcb_focus/pcb_focus_telecentric_'+Index$'03d')

 

****自定义的评判函数,返回一个数值来表示这个图像的清晰度,越高表示越清晰

evaluate_definition (Image, 'Brenner', Value)

 

dev_display (Image)

Ret:=[Ret,Value]

endfor

*使用直方图显示清晰度结果

VMax:=max(Ret)

VMin:=min(Ret)

GRet := 100*(Ret-VMin)/(VMax-VMin)

gen_region_histo(Region, Ret, 255, 255, 1)

*找到峰值对应的那张图,确实是最清晰的那张。

qxd:=find(Ret, max(Ret))

read_image (GoodImage, 'pcb_focus/pcb_focus_telecentric_'+qxd$'03d')

dev_display (GoodImage)

dev_display (Region)

 

自定义的评判函数

evaluate_definition(Image : : Method : Value)

scale_image_max(Image, Image)

get_image_size(Image, Width, Height)

 

if(Method = 'Deviation')

*方差法

region_to_mean (Image, Image, ImageMean)

convert_image_type (ImageMean, ImageMean, 'real')

convert_image_type (Image, Image, 'real')

sub_image(Image, ImageMean, ImageSub, 1, 0)

mult_image(ImageSub, ImageSub, ImageResult, 1, 0)

intensity(ImageResult, ImageResult, Value, Deviation)

 

elseif(Method = 'laplace')

*拉普拉斯能量函数

laplace (Image, ImageLaplace4, 'signed', 3, 'n_4')

laplace (Image, ImageLaplace8, 'signed', 3, 'n_8')

add_image(ImageLaplace4,ImageLaplace4,ImageResult1, 1, 0)

add_image(ImageLaplace4,ImageResult1,ImageResult1, 1, 0)

add_image(ImageLaplace8,ImageResult1,ImageResult1, 1, 0)

mult_image(ImageResult1, ImageResult1, ImageResult, 1, 0)

intensity(ImageResult, ImageResult, Value, Deviation)

 

elseif(Method = 'energy')

*能量梯度函数

crop_part(Image, ImagePart00, 0, 0, Width-1, Height-1)

crop_part(Image, ImagePart01, 0, 1, Width-1, Height-1)

crop_part(Image, ImagePart10, 1, 0, Width-1, Height-1)

convert_image_type (ImagePart00, ImagePart00, 'real')

convert_image_type (ImagePart10, ImagePart10, 'real')

convert_image_type (ImagePart01, ImagePart01, 'real')

sub_image(ImagePart10, ImagePart00, ImageSub1, 1, 0)

mult_image(ImageSub1, ImageSub1, ImageResult1, 1, 0)

sub_image(ImagePart01, ImagePart00, ImageSub2, 1, 0)

mult_image(ImageSub2, ImageSub2, ImageResult2, 1, 0)

add_image(ImageResult1, ImageResult2, ImageResult, 1, 0)

intensity(ImageResult, ImageResult, Value, Deviation)

elseif(Method = 'Brenner')

*Brenner函数法

crop_part(Image, ImagePart00, 0, 0, Width, Height-2)

convert_image_type (ImagePart00, ImagePart00, 'real')

crop_part(Image, ImagePart20, 2, 0, Width, Height-2)

convert_image_type (ImagePart20, ImagePart20, 'real')

sub_image(ImagePart20, ImagePart00, ImageSub, 1, 0)

mult_image(ImageSub, ImageSub, ImageResult, 1, 0)

intensity(ImageResult, ImageResult, Value, Deviation)

elseif(Method = 'Tenegrad')

*Tenegrad函数法

sobel_amp (Image, EdgeAmplitude, 'sum_sqrt', 3)

min_max_gray(EdgeAmplitude, EdgeAmplitude, 0, Min, Max, Range)

threshold(EdgeAmplitude, Region1, 11.8, 255)

region_to_bin(Region1, BinImage, 1, 0, Width, Height)

mult_image(EdgeAmplitude, BinImage, ImageResult4, 1, 0)

mult_image(ImageResult4, ImageResult4, ImageResult, 1, 0)

intensity(ImageResult, ImageResult, Value, Deviation)

 

elseif(Method = '2')

 

elseif(Method = '3')

 

endif

 

return ()

posted @ 2022-05-31 23:51  ihh2021  阅读(910)  评论(0编辑  收藏  举报