zoukankan      html  css  js  c++  java
  • Halcon 学习笔记3 仿射变换

    像素的减少

    开运算(较少)

    腐蚀(去除更多)

    对灰度图像的开运算或腐蚀 相当于将灰度图像变暗

    像素增加

    闭运算(较少)

    膨胀(较多)

    对灰度图像的闭运算或膨胀 相当于将灰度图像变亮

    仿射变换

    另外一种仿射变换

    * 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')
    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.
    access_channel (ImageOrig, Image1, 1)
    threshold (Image1, Region, 90, 255)
    shape_trans (Region, Blister, 'convex')
    orientation_region (Blister, Phi)//计算角度Phi
    area_center (Blister, Area1, Row, Column)//获取面积和中心点坐标
    *将原来的(Row, Column, Phi)表示为(Row, Column, 0),也就是将角度调正
    *输出变换矩阵HomMat2D
    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
    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)
        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 (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
    

    仿射变换 理论

    https://www.cnblogs.com/liekkas0626/p/5238564.html 

  • 相关阅读:
    三剑客
    走近SQL Server的游标
    PostSharp的AOP设计在.NET Remoting中的应用
    总结在使用VB 6.0和C#编写ActiveX控件的实践 (一)
    动态为程序指定快捷键
    为Reporting Service部署自定义程序集可能遇到的问题
    如何更改服务器名称
    如何产生固定的随机数(VBA)
    使用HTTP发送消息(消息队列技术)
    使用TransactionScope做分布式事务协调
  • 原文地址:https://www.cnblogs.com/my-cat/p/8206128.html
Copyright © 2011-2022 走看看