此实例通过使用Halcon实现5种清晰度算法函数:
1. 方差算法函数;
2. 拉普拉斯能量函数;
3. 能量梯度函数;
4. Brenner函数;
5. Tenegrad函数;
测试效果如下图片;找到峰值对应的那张图,确实是最清晰的那张;使用直方图显示清晰度结果,如果有更好的方法,那就跟帖回复吧。
此实例有HalconBBS群友提供!
*evaluate_definition的使用例子 *使用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, '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$'03d') 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 ()
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


