机器视觉相机自动对焦算法

第一,Brenner梯度法、

第二,Tenegrad梯度法、

第三,laplace梯度法、

第四,方差法、

第五,能量梯度法。

此实例通过使用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')endifreturn ()

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 ()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455481.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新脉集团携手中宏大数据 共推县域乡村振兴与数据资产化

2024年10月23日,数字生态赋能平台新脉集团与中宏大数据产业有限责任公司正式宣布达成战略合作。新脉集团创始人兼CEO李晶、新脉集团联合创始人兼CSO梁钟、新脉集团首席城市战略顾问邓详达、新脉中医健康教育学院院长王庆辉以及中宏大数据产业有限责任公司总裁张春宝…

053_python基于深度学习的短视频内容理解与推荐系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

ZYNQ PS_GPIO中断

REVIEW zynq PS端 GPIO_zynq modem signal-CSDN博客 C基础与SDK调试方法_csdk-CSDN博客 AXI_GPIO_axigpio-CSDN博客 对于GPIO,前面只用了简单读写,今天搞一下中断 1. 今日摸鱼任务 了解中断原理,实现PS_GPIO中断。 MIIO: #define PS_KEY 47#…

零售行业的数字化营销转型之路

一方面,市场竞争激烈,电商平台、新兴品牌和跨界对手带来巨大压力。另一方面,消费者需求变化迅速,更加追求个性化、多元化和便捷化的购物体验,同时传统零售企业还面临着高成本压力,如租金、人力和库存等。 然…

Chainlit集成LlamaIndex和Chromadb实现RAG增强生成对话AI应用

前言 本文主要讲解如何使用LlamaIndex和Chromadb向量数据库实现RAG应用,并使用Chainlit快速搭建一个前端对话网页,实现RAG聊天问答增强的应用。文章中还讲解了LlamaIndex 的CallbackManager回调,实现案例是使用TokenCountingHandler&#xf…

Pollard‘s p-1算法

概述 光滑数 (Smooth number):指可以分解为多个小素数乘积的正整数 当p是N 的因数,并且p−1是光滑数,可以考虑使用Pollards p-1算法来分解N 当p是N的因数,并且p1是光滑数,可以考虑使用Williamss p1算法来分解N 这里…

程序员节-回顾篇

回顾: 时间如白驹过隙,转眼间,我们又走过了一个充满挑战与机遇的年份。回顾过去的一年,心中充满了感慨与收获。 一、个人成长 这一年里,我在各个方面都有了显著的成长。在工作上,我通过不断学习和实践&a…

【小洛的VLOG】Web 服务器高并发压力测试(Reactor模型测试)

目录 引言 工具介绍 环境介绍 测试结果 个人主页:东洛的克莱斯韦克-CSDN博客 引言 大部分的网络通信都是支持TCP/IP协议栈,为了保证通信的可靠性,客户端和服务端之间需要建立链接。服务端能并发处理多少个链接,平均每秒钟能处理…

国产蓝牙耳机哪个品牌值得买?百元国产蓝牙耳机品牌排行榜

一款优质的蓝牙耳机总能为我们带来更加便捷、舒适的听觉体验,而在众多蓝牙耳机品牌中,国产蓝牙耳机凭借其高性价比、丰富的功能和独特的设计,逐渐赢得了消费者的青睐,那么国产蓝牙耳机哪个品牌值得买?作为一个资深的蓝…

一、Linux 目录文件

一、目录结构 |-/ # 根节(cd /) |-/bin # 系统命令 |-/boot # 启动目录 |-/dev # 设备文件保存目录 |-/etc # 系统的所有配置文件|-profile # 环境变量配置文件(修改后需source /etc/profile使配置文件立即生效) |-/home # 普通用…

光储充微电网:策略调度带领能源新未来---安科瑞 吴雅芳

一、光储充微电网概述 光储充微电网是一种高度智能化的电力系统,在新能源领域占据着重要地位。它主要由光伏电站、储能系统、充电桩、微电网控制器等组成。 光伏电站是光储充微电网的核心部分之一,应选择稳定的组件和好的支架。在设计光伏发电系统时&a…

解锁文本数据可视化的无限可能:Wordcloud库全解析

文章目录 **🌟解锁文本数据可视化的无限可能:Wordcloud库全解析🔐**1. **背景介绍**2. **Wordcloud库是什么?**3. **如何安装Wordcloud库?**4. **Wordcloud库的基本函数使用方法**5. **实际应用场景**6. **常见问题及解…

实操 maxkey对接三方文档

实操 maxkey 对接三方文档 概述前置准备:MaxKey 安装与配置:第三方系统准备网络环境 对接三方配置oauth2协议对接导入jar包(调接口)权限加回调重定向获取token处理业务 api对接三方获取api凭证配置 MaxKey更新代码 概述 最近在搞m…

hhdb数据库介绍

背景 随着互联网的崛起,海量数据的存储、计算、分析需求越来越普遍。在各种计算机应用场景中,传统集中式数据库面临着理论升级和技术升级两大难题。21世纪以来,随着以 Hadoop及其衍生技术为代表的大规模数据处理技术的崛起,数据库…

迁移学习|ResNet18

一、导入库 二、设置随机种子 三、数据增强和数据加载 四、加载预训练模型 五、定义损失函数和优化器 六、学习率调度器 七、训练模型 八、可视化训练过程 九、总结 1. 常见优化器概述 1.1 随机梯度下降(SGD: Stochastic Gradient Descent) 简介&…

SIP 业务举例之 三方通话:邀请第三方加入的信令流程

目录 1. 3-Way Conference - Third Party Is Added 简介 2. RFC5359 的 3-Way Conference - Third Party Is Added 信令流程 3. 3-Way Conference - Third Party Is Added 总结 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信)…

青少年编程能力等级测评CPA C++(三级)-试卷2

青少年编程能力等级测评CPA C(三级)-试卷2 一、单项选择题(共15题,每题3分,共45分) CP3_2_1.在宽度为500米的河道上,修建一个拦河大坝。施工队每天筑坝50米,由于当时条件…

Qt 实战(11)样式表 | 11.2、使用样式表

文章目录 一、使用样式表1、盒子模型2、应用样式表2.1、全局应用2.2、局部应用2.3、通过文件应用 3、使用样式表实现换肤 前言: 在Qt框架中,样式表(Style Sheets)是一种功能强大的工具,它允许开发者以一种简洁而高效的…

怎么把本地代码上传到阿里云里面

项目需求 将本地项目上传到阿里云,一般有两种情况 1.在本地创建的项目,没有关联过其他的git远程仓库。 2.从其他项目复制的项目代码,但是想要以此项目为基础重新创建一个新的项目。 解决方式 第一种 第一种项目很好解决,就按…

LeetCode题练习与总结:路径交叉--335

一、题目描述 给你一个整数数组 distance 。 从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南移动 distance[2] 米,向东移动 distance[3] 米,持续移动。也就是说&#xf…