机器视觉9 —— CogHistogramTool 直方图工具
CogHistogramTool 是康耐视CognexVisionPro 中的一个用于计算和分析图像直方图的工具。以下是其详细介绍功能直方图计算能计算图像的灰度直方图统计图像中每个灰度值的像素数量也能计算颜色直方图统计图像中每种颜色值的像素数量。区域选择支持对整个图像或指定区域计算直方图方便用户根据具体需求分析图像不同部分的像素分布。统计分析提供直方图的统计数据如均值、方差、标准差、像素总数、中值、出现概率最大的像素值等帮助用户更全面地了解图像像素的分布特征。应用场景图像增强通过分析直方图来调整图像的对比度和亮度增强图像质量例如可以根据直方图的分布情况拉伸或压缩图像的灰度范围使图像的细节更加清晰。质量检测在工业自动化领域通过直方图分析产品图像的灰度分布检测质量缺陷。如产品表面的划痕、污渍等可能会导致图像灰度分布的异常通过分析直方图可以发现这些异常从而实现质量检测。使用方法在 VisionPro 中通常先打开工具栏通过双击或点击鼠标拖拽添加 CogHistogramTool 工具。然后添加输入图像可以通过点击鼠标右键 “链接到” 或以连线拖拽的方式选择相应输入图片。接着设置需要统计灰度值的区域默认状态下是统计整个图像所有像素的灰度值信息。运行工具后可得到像素灰度值的分布直方图在结果栏中可查看各种统计信息。用直方图工具检测有胶无胶图像是常用的兔子头图像把眼睛位置涂抹当做胶来检测。工具搭建由于是RGB彩图需要用到 CogImageConvertTool 格式转换工具把彩图转换为灰度图用灰度图给到 Block 使用Block里面添加了模板工具、定位工具和灰度检测工具。输入像源给到格式转换工具不需要设置什么参数直接运行工具即可。点击运行后可以看到输入的是RGB彩图输出的是8位灰度图用输出的灰度图给到后续的工具。灰度检测用两个灰度工具分别检测左右眼睛位置判断查看结果可以看到平均值差异很大就用平均值来做判断平均值小于50为无胶大于50为有胶。判断后的显示效果脚本显示脚本分析及文字显示这里用了简写。脚本中 CogHistogramTool 结果对应参数用直方图工具完成自动增减亮度功能目的在工业检测中常会遇到同款产品不同颜色的情况需要设置不同的亮度来突出检测部分特征使用 CogHistogramTool 直方图工具搭配 CogIPOneImageTool 图像处理工具完成自动增减亮度的功能当切换不同颜色产品时自动设置合适的系数。工具搭建输入图像给到格式转换图像转换为灰度图灰度图给到blockblock计算出系数给到图像处理工具添加终端右击图像处理工具点击添加终端点击浏览选择所有未过滤找到所需的参数点击添加输入不是输出block工具使用block工具是为了方便写脚本和添加自定义参数block工具内包含了两个直方图工具选取不同位置来计算一个平均值来决定系数。自定义输出参数脚本编写把得到的系数赋值给到输出参数把输出参数链接到图像处理工具的灰度乘数参数上当系数变化时自动修改灰度乘数的值得到不同亮度的图像。脚本源码有胶无胶判断#region namespace imports using System; using System.Collections; using System.Drawing; using System.IO; using System.Windows.Forms; using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock; using Cognex.VisionPro3D; using Cognex.VisionPro.ImageProcessing; #endregion public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase { #region Private Member Variables private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock; private CogGraphicCollection gc new CogGraphicCollection(); #endregion /// summary /// Called when the parent tool is run. /// Add code here to customize or replace the normal run behavior. /// /summary /// param namemessageSets the Message in the tools RunStatus./param /// param nameresultSets the Result in the tools RunStatus/param /// returnsTrue if the tool should run normally, /// False if GroupRun customizes run behavior/returns public override bool GroupRun(ref string message, ref CogToolResultConstants result) { // To let the execution stop in this script when a debugger is attached, uncomment the following lines. // #if DEBUG // if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); // #endif // Run each tool using the RunTool function foreach(ICogTool tool in mToolBlock.Tools) mToolBlock.RunTool(tool, ref message, ref result); gc.Clear(); CogHistogramTool his1 mToolBlock.Tools[CogHistogramTool1] as CogHistogramTool; CogHistogramTool his2 mToolBlock.Tools[CogHistogramTool2] as CogHistogramTool; double newMean (his1.Result.Mean his1.Result.Mean) / 2; if (his1.Result.Mean 50) AddLabel(100, 50, 左眼有胶, CogColorConstants.Green); else AddLabel(100, 50, 左眼无胶, CogColorConstants.Red); if (his2.Result.Mean 50) AddLabel(100, 110, 右眼有胶, CogColorConstants.Green); else AddLabel(100, 110, 右眼无胶, CogColorConstants.Red); AddLabel(400, 50, 最大值: his1.Result.Maximum, CogColorConstants.Cyan); AddLabel(400, 80, 平均值: his1.Result.Mean, CogColorConstants.Cyan); AddLabel(400, 110, 中值: his1.Result.Median, CogColorConstants.Cyan); AddLabel(400, 140, 最小值: his1.Result.Minimum, CogColorConstants.Cyan); AddLabel(400, 170, 模式: his1.Result.Mode, CogColorConstants.Cyan); AddLabel(400, 200, 示例: his1.Result.NumSamples, CogColorConstants.Cyan); AddLabel(400, 230, 标准差: his1.Result.StandardDeviation, CogColorConstants.Cyan); AddLabel(400, 270, 方差: his1.Result.Variance, CogColorConstants.Cyan); return false; } // 文本方法 private void AddLabel (double x, double y, string text, CogColorConstants color) { CogGraphicLabel label new CogGraphicLabel(); label.Color color; label.Font new Font(楷体, 30); label.SetXYText(x, y, text); gc.Add(label); } #region When the Current Run Record is Created /// summary /// Called when the current record may have changed and is being reconstructed /// /summary /// param namecurrentRecord /// The new currentRecord is available to be initialized or customized./param public override void ModifyCurrentRunRecord(Cognex.VisionPro.ICogRecord currentRecord) { } #endregion #region When the Last Run Record is Created /// summary /// Called when the last run record may have changed and is being reconstructed /// /summary /// param namelastRecord /// The new last run record is available to be initialized or customized./param public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord) { foreach (ICogGraphic item in gc) { mToolBlock.AddGraphicToRunRecord(item, lastRecord, CogPMAlignTool1.InputImage, ); } } #endregion #region When the Script is Initialized /// summary /// Perform any initialization required by your script here /// /summary /// param namehostThe host tool/param public override void Initialize(Cognex.VisionPro.ToolGroup.CogToolGroup host) { // DO NOT REMOVE - Call the base class implementation first - DO NOT REMOVE base.Initialize(host); // Store a local copy of the script host this.mToolBlock ((Cognex.VisionPro.ToolBlock.CogToolBlock)(host)); } #endregion }自动亮度#region namespace imports using System; using System.Collections; using System.Drawing; using System.IO; using System.Windows.Forms; using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock; using Cognex.VisionPro3D; using Cognex.VisionPro.ImageProcessing; #endregion public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase { #region Private Member Variables private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock; #endregion /// summary /// Called when the parent tool is run. /// Add code here to customize or replace the normal run behavior. /// /summary /// param namemessageSets the Message in the tools RunStatus./param /// param nameresultSets the Result in the tools RunStatus/param /// returnsTrue if the tool should run normally, /// False if GroupRun customizes run behavior/returns public override bool GroupRun(ref string message, ref CogToolResultConstants result) { // To let the execution stop in this script when a debugger is attached, uncomment the following lines. // #if DEBUG // if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); // #endif // Run each tool using the RunTool function foreach(ICogTool tool in mToolBlock.Tools) mToolBlock.RunTool(tool, ref message, ref result); // 映射工具 CogHistogramTool his1 mToolBlock.Tools[CogHistogramTool1] as CogHistogramTool; CogHistogramTool his2 mToolBlock.Tools[CogHistogramTool2] as CogHistogramTool; // 创建两个浮点数的变量一个接收平均值另一个设置系数 double meanValue (his1.Result.Mean his2.Result.Mean) / 2; double adaptValue 1; // 用两个直方图工具结果的平均值来给系数赋值 if (meanValue 120) adaptValue 1.2; if (meanValue 120 meanValue 100) adaptValue 1.5; if (meanValue 100) adaptValue 2; // 把平均值和系数赋值给到输出参数 mToolBlock.Outputs[meanValue].Value meanValue; mToolBlock.Outputs[kValue].Value adaptValue; return false; } #region When the Current Run Record is Created /// summary /// Called when the current record may have changed and is being reconstructed /// /summary /// param namecurrentRecord /// The new currentRecord is available to be initialized or customized./param public override void ModifyCurrentRunRecord(Cognex.VisionPro.ICogRecord currentRecord) { } #endregion #region When the Last Run Record is Created /// summary /// Called when the last run record may have changed and is being reconstructed /// /summary /// param namelastRecord /// The new last run record is available to be initialized or customized./param public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord) { } #endregion #region When the Script is Initialized /// summary /// Perform any initialization required by your script here /// /summary /// param namehostThe host tool/param public override void Initialize(Cognex.VisionPro.ToolGroup.CogToolGroup host) { // DO NOT REMOVE - Call the base class implementation first - DO NOT REMOVE base.Initialize(host); // Store a local copy of the script host this.mToolBlock ((Cognex.VisionPro.ToolBlock.CogToolBlock) (host)); } #endregion }

相关新闻

BetterNCM Installer终极指南:3分钟搞定网易云插件安装的完整方案

BetterNCM Installer终极指南:3分钟搞定网易云插件安装的完整方案

BetterNCM Installer终极指南:3分钟搞定网易云插件安装的完整方案 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件安装的复杂步骤而烦恼吗&#xff1f…

2026/9/15 10:27:51 阅读更多 →
nginx---cors跨域风险修复和防止Host头攻击

nginx---cors跨域风险修复和防止Host头攻击

经过两天的折腾,试了很多方法,最后总结下有效的设置:location /test/abc/ {#防止修改Host头攻击if ($http_Host ! "***.***.com:15689"){return 403;}#不允许任意跨域访问set $andflag 0;set $cors ;#后台已设置Access-Control-All…

2026/9/24 22:22:13 阅读更多 →
AI驱动的GEO智能体:数字营销的实时优化与多维度数据融合

AI驱动的GEO智能体:数字营销的实时优化与多维度数据融合

1. 项目背景与核心价值在数字营销领域,GEO(Geo-Enabled Optimization)优化一直是品牌提升本地化营销效果的关键手段。传统GEO优化主要依赖人工分析地理位置数据、用户画像和消费行为,不仅效率低下,还难以应对瞬息万变的…

2026/9/22 2:16:37 阅读更多 →

最新新闻

家用电梯品牌怎么选?从驱动系统到安装维保的全维度解析

家用电梯品牌怎么选?从驱动系统到安装维保的全维度解析

我做了这么多年家用电梯相关的工作,最常被问到的一句话就是“家用电梯哪个品牌好”。说实话,这个问题每次听到我都得先愣一下,因为答案远没有一句“某某品牌不错”那么简单。家用电梯不是普通家电,它更像是给房子做的半定制机电系…

2026/9/24 22:22:22 阅读更多 →
巡检超自动化平台的核心能力矩阵

巡检超自动化平台的核心能力矩阵

一个真正的巡检超自动化平台,不应该只是“把人工巡检搬到电脑上”,而是从采集、分析、决策到处置的全链路智能升级。 以下六大核心能力,构成了巡检超自动化平台的完整能力矩阵。一、全栈纳管能力——万物可检,不留死角“支持SSH/S…

2026/9/24 22:22:22 阅读更多 →
Spring Boot与Vue.js健康管理信息系统设计实现与部署实践

Spring Boot与Vue.js健康管理信息系统设计实现与部署实践

我做了三年Java后端,最近帮一个学弟把他的毕业设计从零到一完整搭了一遍,题目是“基于Spring Boot与Vue.js的健康管理信息系统设计与实现”——说白了就是一个偏“养生”主题的全栈Web系统。这个题目在计算机毕业设计里属于典型的前后端分离项目&#xf…

2026/9/24 22:22:22 阅读更多 →
文献检索实战指南:布尔运算、数据库选型与检索式构建

文献检索实战指南:布尔运算、数据库选型与检索式构建

把题目整段粘进搜索框,回车,然后对着几万条结果发呆——这是我见过最多人查文献的方式,也是效率最低的方式。查文献看着是"搜一下"的事,实际上是设计一套查询方案的过程:主题怎么拆,关键词怎么扩…

2026/9/24 22:22:22 阅读更多 →
GPT-6 Sol 与 Claude Opus 5.5 同日发布:价格与额度重置

GPT-6 Sol 与 Claude Opus 5.5 同日发布:价格与额度重置

9 月 22 日,AI 圈像约好了似的:GPT-6 Sol 和 Claude Opus 5.5 同一天发布 这次让我最想立刻开测的,是价格和额度 GPT-6 Sol 的 API 标准价降到每百万输入 token $2、输出 token $10,对比 GPT-5.6 Sol 的 $4/$20&…

2026/9/24 22:22:22 阅读更多 →
汽车电子PCBA包工包料代工厂怎么选?2026年选型避坑指南

汽车电子PCBA包工包料代工厂怎么选?2026年选型避坑指南

汽车电子PCBA包工包料代工这个行当,水比大多数人想象的要深。我在这条供应链上摸爬滚打了十来年,见过太多项目因为选错代工厂,从"小批量试产"一路拖成"无限期搁置",也见过不少采购负责人被"低价包工包料…

2026/9/24 22:21:21 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →