check_blister

* 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.
* 
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')*设置字体
*set_display_font( : : WindowHandle, Size, Font, Bold, Slant : )
*WindowHandle 窗体句柄
*size 字体大小
*字体名称:可以使用“mono”、“sans”、“serif”或特定的字体名称。“mono”将被映射到
Windows上的“Courier New”,Linux上的“Courier”,以及OS X上的“Menlo”。“sans”将
被映射到Windows和OS X上的“Arial”,以及Linux上的“helvetica”。“serif”将被映射
到Windows和OS X上的“Times New Roman”,以及Linux上的“Times”
*bold 是否加粗 默认true(加粗) 
dev_set_draw ('margin')*margin 显示轮廓,fill 填充,默认值为fill
dev_set_line_width (3)*设置字体宽度

access_channel (ImageOrig, Image1, 1)*获得多通道图像的一个通道图像
*access_channel(MultiChannelImage : Image : Channel : )
*MultiChannelImage 一副多通道图像,
*image 输出所选的单通道图片
*channel 所要选择的通道(若是3通道RGB图像,1位B,2为G,3为R)

threshold (Image1, Region, 90, 255)*固定阈值分割,选取灰度值90<=g<=255的像素点
shape_trans (Region, Blister, 'convex')
*shape_trans(Region : RegionTrans : Type : )
*region 要转换的区域,regiontrans,转换后的区域
*type:'convex',凸性转换,把凹陷的部分连接;'ellipse'转换为椭圆区域
*'outer_circle',最小外接圆;'inner_circle'最小内接圆;'rectangle1'无方向最小外
接矩形,
*'rectangle2'带方向的最小外接矩形(带方向是指不和坐标轴平行,不带方向和坐标轴平
*行)'inner_rectangle1'最小内接矩形;'inner_center'轮廓上与重心最近的点
orientation_region (Blister, Phi)*获得区域角度
area_center (Blister, Area1, Row, Column)*获得区域中心和面积
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
*获得仿射变换矩阵Row, Column, Phi:原始点的行列坐标和角度;
*Row, Column, 0要转换的行列坐标和角度;HomMat2D 输出的仿射变换矩阵
affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')
*affine_trans_image(Image : ImageAffineTrans : HomMat2D, Interpolation, AdaptImageSize : )
*Interpolation:nearest_neighbor临近差值(从最近的像素值决定像素值)
*对图片进行仿射变换
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
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, ImageAffineTrans, HomMat2D, 'constant', 'false')
    * 
    * Segment pills
    reduce_domain (ImageAffineTrans, ChambersUnion, ImageReduced)
    *将给定图像的定义域缩减到指定的区域。新的定义域计算为旧定义域与区域的交点。
    *缩减后图像大小不变,只是缩减区域之外的像素不再包含灰度值
    decompose3 (ImageReduced, ImageR, ImageG, ImageB)*(将一副彩色图像分为
    *RGB图像,第一通道为R,2为G,3为B)
    var_threshold (ImageB, Region, 7, 7, 0.2, 2, 'dark')
    *var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, 
    *AbsThreshold, LightDark : )使用根据局部均值和标准差计算的局部阈值对图像进行
    *分割,在非均匀的、有噪声的或照明不均匀的背景上分割区域是可能的。即动态阈值分割
    *MaskWidth, MaskHeight,掩膜的大小过小选的少,过大选的多
    *StdDevScale 高选的少,低选的多,可以是负值
    *LightDark: 'light'亮,'dark'暗, 
    *'equal',m(x,y)-v(x,y)<=g(x,y)<=m(x,y)+v(x,y),'not_equal' 和equal相反
    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 (ImageAffineTrans)
    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', 12, 12 + 600, 'red', 'true')
    else
        disp_message (WindowHandle, 'OK', 'window', 12, 12 + 600, 'forest green', 'true')
    endif
    * 
    Message := '# Correct pills: ' + (NumberP - NumberWP)
    Message[1] := '# Wrong pills  :  ' + NumberWP
    Message[2] := '# Missing pills:  ' + NumberMP
    * 
    Colors := gen_tuple_const(3,'black')
    if (NumberWP > 0)
        Colors[1] := 'red'
    endif
    if (NumberMP > 0)
        Colors[2] := 'red'
    endif
    disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')
    dev_set_color ('red')
    dev_display (WrongPill)
    dev_display (MissingPill)
    if (Index < Count)
        disp_continue_message (WindowHandle, 'black', 'true')
    endif
    stop ()
endfor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值