固态硬盘主控检测工具_固态硬盘用什么软件检测

(87) 2024-07-06 19:01:01

目录

一、程序源码分析

1、关闭窗口,读取原始胶囊图片(三通道),按给定的纵横比打开窗口

2、这里的目的是把图案里面的腔室切割出来,对后续的胶囊处理更加方便

3、这一段目的是找出五行三列的胶囊腔室

4、这一部分是将找到的胶囊区域合并

5、通过循环读取每一张图像,然后找出每张图像中的胶囊的区域

二、相关算子

1、access_channel(MultiChannelImage : Image : Channel : )

2、orientation_region(Regions : : : Phi)

3、vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)

4、affine_trans_image(Image : ImageAffineTrans : HomMat2D, Interpolation, AdaptImageSize : )

5、gen_empty_obj( : EmptyObject : : )

6、gen_rectangle2( : Rectangle : Row, Column, Phi, Length1, Length2 : )

7、concat_obj(Objects1, Objects2 : ObjectsConcat : : )

8、affine_trans_region(Region : RegionAffineTrans : HomMat2D, Interpolate : )

9、decompose3(MultiChannelImage : Image1, Image2, Image3 : : )

10、var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )


一、程序源码分析

* 这个示例演示了制药行业的一个应用程序,任务是检查自动填充胶囊的内容。
* 第一个图像(参考)用于定位泡孔形状内的腔室作为参考模型,然后使用该模型沿此参考形状重新排列后续图像。利用Blob分析对每个腔体的内容进行分割,最后根据一些形状特征进行分类。

1、关闭窗口,读取原始胶囊图片(三通道),按给定的纵横比打开窗口

  • 该图像作为后续图像读取,位置变换的参考

dev_close_window ()
dev_update_off ()
read_image (ImageOrig, 'blister/blister_reference')
dev_open_window_fit_image (ImageOrig, 0, 0, -1, -1, WindowHandle)
dev_display(ImageOrig)

*设置显示的字体,设置填充方式为边缘填充,设置线宽为3
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)

固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第1张
原图​​​​

2、这里的目的是把图案里面的腔室切割出来,对后续的胶囊处理更加方便

*原图是彩色图像,提取第一通道图像
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)
*从点和角度计算刚性仿射变换(得到这个区域到0角度位置的仿射矩阵)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
*根据仿射矩阵把原图变换过
affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')

固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第2张

固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第3张
参考图像仿射变换后

3、这一段目的是找出五行三列的胶囊腔室

*创建一个空对象元组,类的实例化,防止空引用异常
gen_empty_obj (Chambers)
*通过循环遍历图像中的胶囊,(88,163)是第一个胶囊腔室的中心坐标,70、150是行、列方向相邻腔室之间的间距
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
stop()

固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第4张
分割出来胶囊的腔室

4、这一部分是将找到的胶囊区域合并

*根据仿射矩阵把原图中的药品区域(就是上述的形状变换后的凸包区域)变换过去,其实就是找到ROI区域
affine_trans_region (Blister, Blister, HomMat2D, 'nearest_neighbor')
*差分大区域和每个药品的矩形小区域​​​​​​​
difference (Blister, Chambers, Pattern)
*每个药品的矩形小区域联合起来
union1 (Chambers, ChambersUnion)

固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第5张
所有腔室合并

5、通过循环读取每一张图像,然后找出每张图像中的胶囊的区域

*得到药品所在的大区域的角度并获取该区域中心坐标与面积
orientation_region (Blister, PhiRef)  

* 得到转换后的角度PhiRef = -3.13984,角度转成正的(+180)
PhiRef := rad(180) + PhiRef
area_center (Blister, Area2, RowRef, ColumnRef)

固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第6张

*每个读取的图像将对齐到这个模式,并缩小到感兴趣的区域,就是是胶囊的腔室
Count := 6
for Index := 1 to Count by 1

  • 新图片中药品大区域的定位(得到药品区域的角度、中心坐标、面积)

    *图像预处理获得ROI区域边缘
    read_image (Image, 'blister/blister_' + Index$'02')
    threshold (Image, Region, 90, 255)
    connection (Region, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, )
    shape_trans (SelectedRegions, RegionTrans, 'convex')

    *获取该图像的角度、中心坐标、面积
    orientation_region (RegionTrans, Phi)
    area_center (RegionTrans, Area3, Row, Column)

固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第7张
获取测试图像的边缘
  • 沿着参考图像的胶囊腔室对齐测试图像,将整个图片仿射到标准位置

    *根据参考药品区域的中心坐标与角度来转换该图像,将其调整到参考图像位置进行分割
    vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)
    affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')

固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第8张
边框是原位置,图象是对齐参考图像后的图像
  •  分割胶囊

    *从该图像中分割出胶囊区域
    reduce_domain (ImageAffineTrans, ChambersUnion, ImageReduced)
    *三通道图像分离成三张图片
    decompose3 (ImageReduced, ImageR, ImageG, ImageB)
    *先用7*7的掩膜在图像上逐个像素游走,用原图的像素和当前像素的灰度均值对比,当原图的值低于掩膜的值的时候将该区域分割出来。
    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')

固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第9张

  •  将每一张图片中的所有胶囊的轮廓区域提取出来,并计算正常区域的、错误区域的、没找到轮廓区域的胶囊的数量,并在后面计数统计,显示出来。

    *计算分割出来的区域数量
    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)
      

       *如果面积为0,表示没有药品,大于0,表示有
        if (Area > 0)
            *提取所在区域最大最小的灰度值
            min_max_gray (Pill, ImageB, 0, Min, Max, Range)
            if (Area < 3800 or Min < 60)
                *规定胶囊面积小于3800,最小灰度值小于60为错误的
                concat_obj (WrongPill, Pill, WrongPill)
            endif
        else
            *胶囊面积小于0就是没找到轮廓
            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)
    

    *如果错误或找不到边缘区域数量大于0,这个药片质量不合格
    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')
    *当错误与找不到边缘区域数量大于0时,输出均为红色;正常均为黑色

    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://mushiming.com/)  第10张
正常
固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第11张
有错误

固态硬盘主控检测工具_固态硬盘用什么软件检测 (https://mushiming.com/)  第12张
错误与缺失胶囊

二、相关算子

1、access_channel(MultiChannelImage : Image : Channel : )

  • 定义:访问多通道映像的一个通道

  • 操作符access_channel访问(多通道)输入图像的一个通道。结果是一个单通道图像。采用输入的定义域,通道的编号从1到n。通道的数量可以通过运算符count_channels来确定

  • 参数:输入多通道图像,输出所选定通道图像,要访问的通道索引

2、orientation_region(Regions : : : Phi)

  • 定义:访问多通道映像的一个通道

  • 操作符orientation_region计算区域的方向。如果传递了多个区域,则结果存储在元组中,元组中值的索引对应于输入中区域的索引

  • 参数:要检查区域,输出区域的方位(弧度制)

3、vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)

  • 定义:从点和角度计算刚性仿射变换

  • vector_angle_to_rigid计算一个刚性仿射变换,即一个由一个旋转和一个平移组成的变换,从一个对应的点和两个对应的角度,并将其作为齐次变换矩阵HomMat2D返回。原始点的坐标被传入(Row1,Column1),而对应的角度被传入Angle1。转换点的坐标传递在(Row2,Column2)中,而对应的角度传递在Angle2中。HomMat2D可以直接与使用仿射变换转换数据的运算符一起使用,例如affine_trans_image。

  • 参数:输入原始点的坐标与角度,输入转换点的坐标与角度,输出变换矩阵

4、affine_trans_image(Image : ImageAffineTrans : HomMat2D, Interpolation, AdaptImageSize : )

  • 定义:对图像应用任意的仿射二维变换。

  • affine_trans_image对Image中给出的图像应用一个任意的仿射二维变换,即缩放、旋转、平移和倾斜(倾斜),并在ImageAffineTrans中返回转换后的图像。仿射变换由HomMat2D中给出的齐次变换矩阵来描述,它可以使用算子hom_mat2d_identity, hom_mat2d_scale, hom_mat2d_rotate, hom_mat2d_translate等来创建,或者是像vector_angle_to_rigid这样的算子的结果。

  • 参数:输入图像,输出变换后的图像,变换矩阵,插值类型,适应结果图像的大小

5、gen_empty_obj( : EmptyObject : : )

  • 定义:创建一个空对象元组

  • 操作符gen_empty_obj创建一个空元组。这意味着输出参数不包含任何对象。因此,运算符count_obj返回0。但是,可以调用clear_obj来获取输出。应该注意的是,不能将任何对象与空区域混淆。如果是空区域,即0像素的区域,count_obj返回值为1。

  • 参数:输入图像,输出变换后的图像,变换矩阵,插值类型,适应结果图像的大小

6、gen_rectangle2( : Rectangle : Row, Column, Phi, Length1, Length2 : )

  • 定义:创建一个任意方向的矩形

  • 操作符gen_rectangle2生成一个或多个矩形,其中心为(Row, Column),方向为Phi,半边长为Length1和Length2。方向以圆弧度量给出,并表示水平轴与边缘之间的角度(带有Length1)(数学上为正)。

  • 参数:输出创建的矩形区域,输入中心点坐标,与水平方向的夹角,矩形宽高的一半

7、concat_obj(Objects1, Objects2 : ObjectsConcat : : )

  • 定义:连接两个图标对象元组

8、affine_trans_region(Region : RegionAffineTrans : HomMat2D, Interpolate : )

  • 定义:对区域应用任意仿射二维变换

  • 对Region中给定的区域应用一个任意的仿射二维转换,即缩放、旋转、平移和倾斜(倾斜),并在RegionAffineTrans中返回转换后的区域

  • 参数:要旋转和缩放的区域,输出转换后的区域,变换矩阵,插值类型

9、decompose3(MultiChannelImage : Image1, Image2, Image3 : : )

  • 定义:将三通道图像转换为三幅图像

  • 算子decompose3将一幅3通道图像转换为三幅具有相同定义域的单通道图像。没有为输出图像分配新的存储空间。相反,创建的图像包含对现有输入图像通道的引用

10、var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )

  • 定义:用局部均值和标准差分析对图像进行阈值处理

  • 使用var_threshold,可以选择输入图像的像素具有较高的局部标准差(对于正的StdDevScale)或较低的局部标准差(对于负的StdDevScale)而且根据LightDark的说法,是局部亮或暗的。因此,在不均匀的,有噪声的,或不均匀的照明背景上分割区域是可能的。

  • 参数:输入图像,输出分割区域,滤波的掩码,为灰度值的标准差因子,最小灰度值与平均值的差值,阈值分割类型

THE END

发表回复