Blob+定位+特征来识别药片缺陷

2023-11-03

原图

定位

结果

代码

* This example demonstrates an application from the pharmaceutical
* industry. The task is to check the content of automatically filled
* blisters. The first image (reference) is used to locate the chambers
* within a blister shape as a reference model, which is then used to
* realign the subsequent images along to this reference shape. Using
* blob analysis the content of each chamber is segmented and finally
* classified by a few shape features.
* 1.采集图像
dev_close_window ()
dev_update_off ()
read_image (ImageOrig, 'blister/blister_reference')
dev_open_window_fit_image (ImageOrig, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
* 
* In the first step, we create a pattern to cut out the chambers in the
* subsequent blister images easily.
*2.定位(求标准位置blob)
access_channel (ImageOrig, Image1, 1)
threshold (Image1, Region, 90, 255)
shape_trans (Region, Blister, 'convex')
orientation_region (Blister, Phi)
area_center (Blister, Area1, Row, Column)
*图像转正
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')
gen_empty_obj (Chambers)
for I := 0 to 4 by 1
    Row := 88 + I * 70
    for J := 0 to 2 by 1
        Column := 163 + J * 150
        gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)
        concat_obj (Chambers, Rectangle, Chambers)
    endfor
endfor
*区域转正
affine_trans_region (Blister, Blister, HomMat2D, 'nearest_neighbor')
difference (Blister, Chambers, Pattern)
union1 (Chambers, ChambersUnion)
orientation_region (Blister, PhiRef)
PhiRef := rad(180) + PhiRef
*转正后的坐标
area_center (Blister, Area2, RowRef, ColumnRef)
* 
* 
* Each image read will be aligned to this pattern and reduced to the area of interest,
* which is the chambers of the blister
*3.缺陷检测
Count := 6
for Index := 1 to Count by 1
    read_image (Image, 'blister/blister_' + Index$'02')
    threshold (Image, Region, 90, 255)
    connection (Region, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 9999999)
    shape_trans (SelectedRegions, RegionTrans, 'convex')
    * 
    * Align pattern along blister of image
    orientation_region (RegionTrans, Phi)
    area_center (RegionTrans, Area3, Row, Column)
    vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)
    affine_trans_image (Image, ImageAffinTrans, HomMat2D, 'constant', 'false')
    * 
    * Segment pills
    reduce_domain (ImageAffinTrans, ChambersUnion, ImageReduced)
    decompose3 (ImageReduced, ImageR, ImageG, ImageB)
    var_threshold (ImageB, Region, 7, 7, 0.2, 2, 'dark')
    connection (Region, ConnectedRegions0)
    closing_rectangle1 (ConnectedRegions0, ConnectedRegions, 3, 3)
    fill_up (ConnectedRegions, RegionFillUp)
    select_shape (RegionFillUp, SelectedRegions, 'area', 'and', 1000, 99999)
    opening_circle (SelectedRegions, RegionOpening, 4.5)
    connection (RegionOpening, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
    shape_trans (SelectedRegions, Pills, 'convex')
    * 
    * Classify segmentation results and display statistics
    count_obj (Chambers, Number)
    gen_empty_obj (WrongPill)
    gen_empty_obj (MissingPill)
    for I := 1 to Number by 1
        select_obj (Chambers, Chamber, I)
        intersection (Chamber, Pills, Pill)
        area_center (Pill, Area, Row1, Column1)
        if (Area > 0)
            min_max_gray (Pill, ImageB, 0, Min, Max, Range)
            if (Area < 3800 or Min < 60)
                concat_obj (WrongPill, Pill, WrongPill)
            endif
        else
            concat_obj (MissingPill, Chamber, MissingPill)
        endif
    endfor
    * 
    dev_clear_window ()
    dev_display (ImageAffinTrans)
    dev_set_color ('forest green')
    count_obj (Pills, NumberP)
    count_obj (WrongPill, NumberWP)
    count_obj (MissingPill, NumberMP)
    dev_display (Pills)
    if (NumberMP > 0 or NumberWP > 0)
        disp_message (WindowHandle, 'Not OK', 'window', 10, 10 + 600, 'red', 'true')
    else
        disp_message (WindowHandle, 'OK', 'window', 10, 10 + 600, 'forest green', 'true')
    endif
    disp_message (WindowHandle, '# correct pills: ' + (NumberP - NumberWP), 'window', 10, 10, 'black', 'true')
    disp_message (WindowHandle, '# wrong pills  :  ' + NumberWP, 'window', 10 + 25, 10, 'black', 'true')
    if (NumberWP > 0)
        disp_message (WindowHandle, NumberWP, 'window', 10 + 25, 10 + 180, 'red', 'true')
    endif
    disp_message (WindowHandle, '# missing pills:  ' + NumberMP, 'window', 10 + 50, 10, 'black', 'true')
    if (NumberMP > 0)
        disp_message (WindowHandle, NumberMP, 'window', 10 + 50, 10 + 180, 'red', 'true')
    endif
    dev_set_color ('red')
    dev_display (WrongPill)
    dev_display (MissingPill)
    if (Index < Count)
        disp_continue_message (WindowHandle, 'black', 'true')
    endif
    stop ()
endfor

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Blob+定位+特征来识别药片缺陷 的相关文章

  • Halcon表面检测例程解析

    1 表面划伤检测 例程 xff1a suface scratch dev 描述 xff1a Detect scratches on a surface via local thresholding and morphology 通过使用局部
  • Halcon中两种实现旋转的方法rotate_image和affine_trans_image

    Halcon中实现旋转的方式由两种 一种是rotate image xff0c 该方式实现简单 xff0c 但只能绕中心旋转 二是affine trans image xff0c 该方式实现较复杂 xff0c 但是可以实现绕任意位置的旋转
  • Halcon C#联合编程的一种异常的解决方法

    源码为超人视觉联合C 启蒙班中的示例代码 span class token keyword using span span class token namespace System span span class token punctua
  • Halcon相机标定

    相机标定 相机标定的概念 相机的畸变 相机位置和被拍摄物体位姿关系产生的误差 透镜和成像平面 CMOS 不完全平行 镜头和被拍摄物体不完全平行 标定板 相机标定过程 相机标定的概念 在图像测量过程以及机器视觉应用中 为确定空间物体表面某点的
  • Halcon仿射变换图片(旋转、缩放、平移)

    一 实验要求 把图片中的书摆正 二 实现代码 仅旋转 旋转变换 read image Image C Users 86159 Pictures Saved Pictures 1作业图片 5 2 1 jpg dev close window
  • Halcon图像减法——找两图像的不同

    一 实验要求 1 写程序找出下面两幅图像的不同之处 用红色表示 二 代码实现 read image Image C Users 86159 Pictures Saved Pictures 1作业图片 5 1 1 jpg 照片尺寸 515 6
  • Halcon--灰度腐蚀、二维码识别、图像增强

    二维码识别 create find 识别不到一般对调整识别模型参数 或者对图像进行处理 常用灰度增强或者对比度增强 read image Image datacode ecc200 ecc200 to preprocess 003 gray
  • 引发的异常:“System.BadImageFormatException”(位于 halcondotnet.dll 中)

    System BadImageFormatException 类型的未经处理的异常在 halcondotnet dll 中发生 问题描述 解决办法 问题描述 报错信息如下 System BadImageFormatException 试图加
  • Halcon-表面检测-----裂纹检测

    对应示例程序 detect mura defects blur hdev 目标 实例实现LCD上有很多污点干扰下 检测LCD的印痕检测 思路为 对LCD图像进行拆分 提取RGB三个分量 对B分量进行处理 将其转换为频域内图像 并对其进行高斯
  • 图像处理(1) : 图像增强

    图像增强就是指通过某种图像处理方法对退化的某些图像特征 如边缘 轮廓 对比度等进行处理 以改善图像的视觉效果 提高图像的清晰度 或是突出图像中的某些 有用 压缩其他 无用 信息 将图像转换为更适合人或计算机分析处理的形式 图像增强可以分为两
  • Halcon API

    1 延时等待 wait seconds 0 5 注 括号内以秒为单位 2 遍历文件夹 list files Directory Options Files Directory 目录 文件夹路径 Options 选项 files 指定搜索的格
  • Halcon/C++编程

    配置环境 网上有许多 可以参考配置opencv的步骤 主要就是在配置库目录 包含目录 lib文件 注意 一定要看清楚是win32还是x64 2 实例 显示一幅图像 TODO 在此添加控件通知处理程序代码 HObject ho Image H
  • halcon识别斜着的车牌

    对于倾斜的车牌 我们必须用仿射变换 将车牌弄正 再进行识别 如图 halcon代码 read image Image666 C Users Administrator Desktop 666 jpg decompose3 Image666
  • 基于相关性(NCC)的模板匹配Halcon

    一 原理 归一化相关性 NCC normalization cross correlation 顾名思义 就是用于归一化待匹配目标之间的相关程度 注意这里比较的是原始像素 通过在待匹配像素位置p px py 构建3 3邻域匹配窗口 与目标像
  • halcon颜色识别

    halcon颜色识别 通过不同颜色在灰度图中的阈值范围不同来区分颜色 使用阈值分别选出不同的颜色 使用灰度平均值 循环读图进行处理 HSV模型区分颜色 通过不同颜色在灰度图中的阈值范围不同来区分颜色 使用阈值分别选出不同的颜色 dev cl
  • Halcon三维模型预处理(1):调平的三大手法

    面结构光拍摄生成的点云模型 往往相对系统坐标系是有角度的 首先讲一下调平的目的 1 为接下来的预处理切除背景面做准备 3 不做调平 后续处理会很麻烦 因为不清楚坐标系在平台的为位置 2 对于无序抓取项目 平台相对相机可能是有角度的 将抓取平
  • 颜色识别的实例二

    原图 识别结果 代码 color fuses hdev classify fuses by color dev update window off step set up fuse properties and hue ranges Fus
  • QT6+Halcon

    2020年12月8日 Qt公司正式发布了Qt 6 0 这一软件开发平台全新的主要版本 Qt 6 0 已被重新设计为面向未来 以生产力为重点的基础平台 QT迎来一个新时代 Qt Halcon这种组合在机器视觉方面应用非常广泛 一 Qt6全新理
  • 2、halcon+利用光流场检测运动的物体

    这个事例是应用optical flow mg这个算子来在一个图像序列中计算其光溜 并且分割其运动物体 dev update off 把程序窗口 变量窗口 显示窗体变为off状态 dev close window 关闭显示窗口 read im
  • Halcon模板匹配

    Halcon模板匹配 Halcon模板匹配的方法 模板匹配的流程 基于形状的模板匹配的思路 原理 Halcon模板匹配的方法 模板匹配的流程 基于形状的模板匹配的思路 读取图像 转灰度图 dev close window dev open

随机推荐

  • 机器学习数据预处理——特征选择

    引言 在机器学习的训练过程中 总是会碰到样本大 特征多的数据集 而这些数据集里面的数据有些是用处很小甚至完全无用的 如果一组数据中的无用数据占比较大时 一方面会使得模型的训练时间变长 另一方面模型容易出现欠拟合现象 而如果一组数据中作用较小
  • 你还在手动对数据进行校验,快来使用validation吧

    本篇主要讲解使用javax validation constraints org hibernate validator constraints下的校验方法对实体类进行自动校验 直接对数据进行校验 通过对接收的数据进行校验 如果不符合我们定
  • chatgpt赋能python:Python中的d是什么?详解Python字典(Dictionary)

    Python中的d是什么 详解Python字典 Dictionary 在Python中 d是一个非常重要的数据类型 d代表字典 Dictionary 它是一种可变容器模型 可以存储任意数量的键值对 字典的定义 字典使用花括号 来表示 每个键
  • C++的指针

    C 的指针 在C 中 指针被称为是C C 中的精髓所在 指针是存放内存地址的一种变量 特殊的地方就在它存放的是内存地址 计算机中的内存都是编址的 每个地址都有一个符号 指针是一个无符号整数 它是一个以当前系统寻址范围为取值范围的整数 声明指
  • 软件架构设计---软件架构视图

    软件架构视图 从软件架构本身的特点出发讨论了架构建模及与特定应用领域密切相关的架构风格 本节将从对架构编档的角度对软件架构视图及其风格进行讨论 1 软件视图的分类 现代软件系统非常复杂 通常在某个具体的时间内只需将注意力集中在某几个结构上
  • Delphi实现屏幕截图、窗口截图、指定区域截图

    Use Jpeg procedure TForm1 snapscreen a b c d Integer var bmpscreen Tbitmap jpegscreen Tjpegimage FullscreenCanvas TCanva
  • 【linux】linux系统配置静态IP地址(超详细,手把手教会)

    目录 1 引 言 2 科 普 3 详细教程 3 1 步骤说明 3 2 demo案例 3 3 操作步骤 4 参考文献 1 引 言 在使用Linux系统的过程中 你是否有遇到过需要配置固定IP的场景 是否有遇到过服务器下电再重新上电后需要手动拉
  • Ubuntu安装Samba服务

    1 ubuntu 和windos共享用什么 Samba 共享 Samba 是一种用于 Linux 和 Windows 之间文件共享的协议和工具集 您可以在 Ubuntu 上安装和配置 Samba 服务器 使其能够与 Windows 计算机共
  • 模拟电路设计(23)---模数和数模转换器概述

    ADC概念 现在我们对测温已经习以为常 进出公共场所 时不时就要测量体温 电子温度计对着你手腕 或额头 或耳朵 滴的一声 温度就显示出了 这个过程就涉及本文要介绍的模数转换 模数转换 即Analog to Digital Converter
  • 交换机VLAN及中继配置

    Vlan中继 trunk 是以太网接口之间的点对点链路 负责在单个链路上传输多个VLAN流量 1 配置vlan 一般都是使用这种全局静态配置模式 不使用数据库配置模式来配置vlan了 configure terminal config vl
  • java并发包:概论

    本文转载至 http blog csdn net a910626 article details 51900917 为什么要学习并发 今天和一哥们聊天 聊着聊着聊到钱的方面 当时我就说 全世界60亿人 要是每人给我一块钱那不就发财了啊 哥们
  • Android_API_28使用HTTP请求_笔记

    Google表示 为保证用户数据和设备的安全 针对下一代 Android 系统 Android P 的应用程序 将要求默认使用加密连接 这意味着 Android P 将禁止 App 使用所有未加密的连接 因此运行 Android P 系统的
  • Java中的方法(method)

    1 方法概述 什么是方法 方法是具有独立功能的代码块组织成为一个整体 使其具有特殊功能的代码集 注意 方法必须先创建才可以使用 该过程称为方法定义 方法创建后并不是直接运行的 需要手动使用后执行 该过程称为方法调用 2 方法的定义和调用 2
  • Vue 3 中动态获取高宽

    应用场景 一般用于父组件动态变换宽高 子组件需要同步修改宽高 实现简介 Vue3 写法 思路 1 监听父组件的 宽高 2 将监听到的高度赋给 你需要设置的对象 引入监听 并实现 如何得到动态宽度 此时的 div2 会与 divDom 宽度会
  • Spring Cloud Alibaba之服务容错组件 - Sentinel [规则持久化篇]

    规则持久化 拉模式 在Sentinel控制台对某个微服务的接口资源配置了流控 降级等规则后 若重启了该微服务 那么配置的相关规则就会丢失 因为Sentinel默认将规则存放在内存中 每次重启微服务都得重新配置规则显然是不合理的 所以我们需要
  • 量化投资学习-33:兼听则明,偏听则暗,多种指标综合适用-1

    兼听则明 偏听则暗 量化交易指标需要综合多个技术指标 一 上升期 1 上涨期上涨 买入与持有 1 支撑线 直线支撑 动态划线 均线支撑 稳定 历史数据 支撑线上 持有 2 波浪 1浪涨起点 3浪涨起点 5浪起点 3 均线 多头发散排列 5日
  • ❀数据集 ❀ 了解place365,运行出错解决。持续更新中...

    place365官网 Places A 10 million Image Database for Scene Recognition 官方说明 Places 数据集的设计遵循人类视觉认知的原则 我们的目标是建立一个视觉知识核心 可用于训练
  • WPF编程,Live Charts使用说明(40)——对称行(负堆积行)

    前台 using System using System Windows Controls using LiveCharts using LiveCharts Wpf namespace Wpf CartesianChart Negativ
  • 为啥一个java文件只能有一个public类

    以后 如果有人问你为什么一个java文件只能有一个public类呢 答 很简单啊 因为public类的名字要和java文件名相同 文件名只有一个 当然只能有一个public类 问 good 那为神马文件名必须要和public类名字相同呢 不
  • Blob+定位+特征来识别药片缺陷

    原图 定位 结果 代码 This example demonstrates an application from the pharmaceutical industry The task is to check the content o