|
图像聚焦算法--清晰度评价函数
- *使用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
- evaluate_definition (Image, 'Tenegrad', 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
- dev_display (GoodImage)
- dev_display (Region)
- evaluate_definition函数代码如下:
-
- 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 ()
复制代码
参考:https://blog.csdn.net/wuan584974722/article/details/51435876
|
|