Halcon 傅里叶 - 缺陷检测

一、傅里叶图像简介

      频率特征是图像的灰度变化特征,低频特征是灰度变化不明显,例如图像整体轮廓,高频特征是图像灰度变化剧烈,如图像边缘和噪声。

低频代表图像整体轮廓,高频代表了图像噪声,中频代表图像边缘、纹理等细节。

1、具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。
2、需要提取对比度低或者信噪比低的特征。
3、图像尺寸较大或者需要与大尺寸滤波器进行计算,此时转换至频域计算,具有速度优势。因为空间域滤波为卷积过程(加权求和),频域计算直接相乘。

二、算子解释

calculate_lines_gauss_parameters

*calculate_lines_gauss_parameters    根据要提取线的最大宽度以及对比度计算出lines_gauss算子输入的Sigma、Low、High值
     *MaxLineWidth (input_control) : lines_gauss要提取线条的最大宽度
     *Contrast (input_control) :lines_gauss要提取线的对比度。Contrast 值不仅可以一个,也可以为两个。当值为两个时,数组中的第二个值是要提取线的最小对比度,并且其值不能大于第一个值。比如:[20,10]
     *Sigma (output_control) :获取用于lines_gauss输入的Sigma值
     *Low (output_control):获取用于lines_gauss输入的Low 值
     *High (output_control) :获取用于lines_gauss输入的High 值
*获取lines_gauss算子Sigma, Low, High三个参数值
calculate_lines_gauss_parameters (17, [25,3], Sigma, Low, High)

gen_gauss_filter

*gen_gauss_filter 生成的滤波器图像  
* Sigma1 空间域(像素域)中,高斯分布在滤波器主方向上的空间域标准差,Sigma越大,高斯滤波器的频带就越宽,对图像平滑程度越高
* Sigma2 空间域(像素域)中,垂直于高斯滤波器主方向的标准差。  注:Sigma1和Sigma2确定空间域内高斯函数的平滑量
* phi 滤波器在空间域的主要方向
* Norm : 滤波器的归一化因子。注:如果使用 fft_image 和 fft_image_inv 进行过滤,必须设置参数Norm = 'none’和 Mode = ‘dc_center’。
* Mode:   如果使用rft_generic,则必须使用Mode = 'rft'。
gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)

rft_generic

 *rft_generic   计算输入图像的快速傅里叶变换。一般需要使用两次,因为在频域处理完之后,还需要转换成空间域
    *Image:输入图像。
    *ImageFFT:傅里叶转换后的图像。
    *Direction:计算正向或反向变换。
                        *   to_freq 表示的是从空间域  转频域    
                        *   rom_freq  频域到空间域 
    *Norm  变换的归一化因子 
                        *默认值:'sqrt'(开根号,c=sqrt(M*N),变亮);也可设置为 'n'(图像宽*图像高,c=M*N,变暗), 'none'(不使用,c=1)
    *ResultType:输出图像的图像类型。
                        * 默认值:'complex'(复数图像)生成频域图时,ResultType必须设置为'complex'(输出图像为复数类型),输出是一个尺寸为(w/2+1)*h的复数图像
                        * 也可设置为'byte'(灰度图像), 'cyclic', 'direction', 'int1', 'int2', 'int4', 'real'(实值图像), 'uint2'。  Width设置为一个有效值来完成,即2*w-2或2*w-1,
    *Width:运行时应针对其进行优化的图像宽度。
                        *默认值:512,也可设置为128, 160, 192, 256, 320, 384, 640, 768, 1024, 2048。
    rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)

 cooc_feature_image

 
  *  cooc_feature_image  计算共生矩阵并导出其灰度值特征。  
    * *https://blog.csdn.net/Stone_Wang_MZ/article/details/104537332
    * 灰度共生矩阵
    *    Mat imgInput = (Mat_<uchar>(4, 5) << 
*        1, 1, 5, 6, 8,
*        2, 3, 5, 7, 1, 
*        4, 5, 7, 1, 2, 
*        8, 5, 1, 2, 5);
*    Mat imgGLCM = Mat::zeros(Size(9, 9), CV_8UC1);
*    int nHeight = imgInput.rows;
*    int nWwidth = imgInput.cols;
*    for (int i = 0; i < nHeight; ++i)
*    {
*        for (int j = 0; j < nWwidth - 1; ++j)
*        {
*            int rows = imgInput.at<uchar>(i, j);
*            int cols = imgInput.at<uchar>(i, j + 1);
*            imgGLCM.at<uchar>(rows, cols)++;
*        }
*    }
        *regions  要检查的区域。
        *Image 灰度值图像。
        *LdGray 要区分的灰度值的数量 1, 2, 3, 4, 5, 6, 7, 8
        *Direction  矩阵的计算方向 0, 45, 90, 135, 'mean'
        *Energy 灰度值能量
        *Correlation 灰度值的相关性。
        *Homogeneity 灰度值的局部同质性。
        *Contrast 灰度值对比度。
    cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)

 gen_sin_bandpass

* 生成一个正弦形状的带通滤波器
*2.滤波器与直流项的最大距离
*3.滤波器的归一化因子
*4.直流项在频域的位置
*5.图像宽度
*6.图像高度
gen_sin_bandpass (ImageFilter, 0.1, 'none', 'rft', 512, 512)

 fft_generic


       fft_generic(Image : ImageFFT : Direction, Exponent, Norm, Mode, ResultType : )
       ** 计算输入图像的快速傅里叶变换图像。
       *1.输入图像
       *2.傅里叶转换图像
       *3.正向转换还是反向转换 'to_freq' 'from_freq'
       *4.指数的符号. 正向转换-1,反向转换1
       *5.转换归一化因子.    'n' 'none' 'sqrt'
       *6.直流项在频域的位置 'dc_center' 'dc_edge'
       *7.输出图像的类型 'complex' 'byte' 'real' ....

 correlation_fft 

  *correlation_fft (ImageFFT, ImageFFT, ImageCorrelation)
         * 计算两个图像在频域的相关性
         
         * 将ImageFFT1与ImageFFT2的共轭复数相乘,计算相关系数。
         * 需要注意的是,为了在空间域实现相关性的正确缩放。
         * 前向转换必须使用带Norm = 'none'的fft_generic或rft_generic操作符。
         * 反向转换必须使用带Norm = 'n'的fft_generic或rft_generic操作符。
         * 例程中使用local_max_sub_pix检测时前向和反向用的都是'n'

derivate_gauss  

derivate_gauss (Image, ImageGauss, 3, 'none')
* 将一个图像与高斯函数的导数进行卷积。效果与FFT进行高斯滤波差不多。
主要的区别是边界处理:FFT的定义假设信号是周期性的,因此边界处理是循环的延续。与此相反,derivate_gauss在图像边界使用灰度值的镜像。
通过FFT进行过滤的速度已经快于在Sigma=3(排除创建过滤器的时间)中使用derivate_gauss。这种优势随着Simag的增大而变得更加明显。    
'none' 仅使用平滑
'x' 沿X的一阶导数

 gen_derivative_filter 

gen_derivative_filter (DerivativeFilter, 'x', 1, 'n', 'rft', Width, Height)
* 在频域内产生一个导数滤波器,导数过滤器没有使用任何平滑
* 还要注意的是,不经过平滑处理的导数计算通常不会返回有用的结果,因为噪声会被显著放大。

power_real  

power_real (ImageFFT, PowerSpectrum)
* 计算complex图像的功率谱(频率的模),结果图像为real类型

 binomial_filter

binomial_filter (PowerSpectrum, ImageSmooth, 9, 9)
* 二项式滤波器是一个非常好的近似高斯滤波器,可以非常有效地实现只用整数操作。因此,binomial_filter非常快。

三、halcon 案例

detect_indent_fft.hdev


dev_update_off ()
dev_close_window ()
read_image (Image, 'plastics/plastics_01')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('red')
* specific 特定
* 加速快速傅里叶变换
optimize_rft_speed (Width, Height, 'standard')
* 
* 构造  两个  高斯 滤波   然后做减法
* filters
Sigma1 := 10.0
Sigma2 := 3.0
* 构造  两个  高斯 滤波   然后做减法

*gen_gauss_filter 生成的滤波器图像  
* Sigma1 空间域(像素域)中,高斯分布在滤波器主方向上的空间域标准差,Sigma越大,高斯滤波器的频带就越宽,对图像平滑程度越高
* Sigma2 空间域(像素域)中,垂直于高斯滤波器主方向的标准差。  注:Sigma1和Sigma2确定空间域内高斯函数的平滑量
* phi 滤波器在空间域的主要方向
* Norm : 滤波器的归一化因子。注:如果使用 fft_image 和 fft_image_inv 进行过滤,必须设置参数Norm = 'none’和 Mode = ‘dc_center’。
* Mode:   如果使用rft_generic,则必须使用Mode = 'rft'。
gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)
gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height)

gen_sin_bandpass (ImageFilter, 0.1, 'none', 'rft', 512, 512)

*这一步很重要的
sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
* 
* Process the images iteratively
NumImages := 11
for Index := 1 to NumImages by 1
    * 
    * 读取图像并生成灰度图
    read_image (Image, 'plastics/plastics_' + Index$'02')
    rgb1_to_gray (Image, Image)
    get_image_size (Image, Width1, Height1)
    
    
    *rft_generic   计算输入图像的快速傅里叶变换。一般需要使用两次,因为在频域处理完之后,还需要转换成空间域
    *Image:输入图像。
    *ImageFFT:傅里叶转换后的图像。
    *Direction:计算正向或反向变换。
                        *   to_freq 表示的是从空间域  转频域    
                        *   rom_freq  频域到空间域 
    *Norm  变换的归一化因子 
                        *默认值:'sqrt'(开根号,c=sqrt(M*N),变亮);也可设置为 'n'(图像宽*图像高,c=M*N,变暗), 'none'(不使用,c=1)
    *ResultType:输出图像的图像类型。
                        * 默认值:'complex'(复数图像)生成频域图时,ResultType必须设置为'complex'(输出图像为复数类型),输出是一个尺寸为(w/2+1)*h的复数图像
                        * 也可设置为'byte'(灰度图像), 'cyclic', 'direction', 'int1', 'int2', 'int4', 'real'(实值图像), 'uint2'。  Width设置为一个有效值来完成,即2*w-2或2*w-1,
    *Width:运行时应针对其进行优化的图像宽度。
                        *默认值:512,也可设置为128, 160, 192, 256, 320, 384, 640, 768, 1024, 2048。
    rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)  
    * 这里的频域图像的大小会变的
    get_image_size (ImageFFT, Width2, Height2)
    
    *convol_fft  用在频域内图像使用上面得到一个滤波做图像卷积
    
    convol_fft (ImageFFT, Filter, ImageConvol)
    *图像还原
    rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
    * 又还原到之前的那个大小了
    get_image_size (ImageFiltered, Width3, Height3)
    * 
    * 
    gray_range_rect (ImageFiltered, ImageResult, 10, 10)
    min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
    threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)
    *通过阈值来筛选出缺陷区域
    connection (RegionDynThresh, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4, 99999)
    union1 (SelectedRegions, RegionUnion)
    closing_circle (RegionUnion, RegionClosing, 10)
    connection (RegionClosing, ConnectedRegions1)
    select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)
    area_center (SelectedRegions1, Area, Row, Column)
    * 
    * Display the results
    dev_display (Image)
    Number := |Area|
    if (Number)
        gen_circle_contour_xld (ContCircle, Row, Column, gen_tuple_const(Number,30), gen_tuple_const(Number,0), gen_tuple_const(Number,rad(360)), 'positive', 1)
        ResultMessage := ['Not OK',Number + ' defect(s) found']
        Color := ['red','black']
        dev_display (ContCircle)
    else
        ResultMessage := 'OK'
        Color := 'forest green'
    endif
    disp_message (WindowHandle, ResultMessage, 'window', 12, 12, Color, 'true')
    if (Index != NumImages)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor

 

detect_mura_defects_texture.hdev 


dev_close_window ()
dev_update_off ()
Path := 'lcd/mura_defects_texture_'
read_image (Image, Path + '01')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, 640, 480, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('red')
for F := 1 to 2 by 1
    read_image (Image, Path + F$'.2i')
    decompose3 (Image, R, G, B)
    * Defects are characterized by dark patches. Hence, by substracting the
    * estimated background illumination from the original image the
    * defects become more apparent.
    estimate_background_illumination (B, ImageFFT1)
      *     get_image_size (Image, Width, Height)
      * rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
      **生成一个高斯滤波
      * gen_gauss_filter (ImageGauss, 50, 50, 0, 'n', 'rft', Width, Height)
      **卷积
      * convol_fft (ImageFFT, ImageGauss, ImageConvol)
      * rft_generic (ImageConvol, IlluminationImage, 'from_freq', 'none', 'byte', Width)
      * return () 
        
       * 用原图减去频域卷积后还原的图
    sub_image (B, ImageFFT1, ImageSub, 2, 100)
    * Median filter smoothes out the fine texture, simplifying the following
    * 均值图像
    median_image (ImageSub, ImageMedian, 'circle', 9, 'mirrored')
    *分水岭算法
    watersheds_threshold (ImageMedian, Basins, 20)
    
    
    
    
    
  *  cooc_feature_image  计算共生矩阵并导出其灰度值特征。  
    * *https://blog.csdn.net/Stone_Wang_MZ/article/details/104537332
    * 灰度共生矩阵
    *    Mat imgInput = (Mat_<uchar>(4, 5) << 
*        1, 1, 5, 6, 8,
*        2, 3, 5, 7, 1, 
*        4, 5, 7, 1, 2, 
*        8, 5, 1, 2, 5);
*    Mat imgGLCM = Mat::zeros(Size(9, 9), CV_8UC1);
*    int nHeight = imgInput.rows;
*    int nWwidth = imgInput.cols;
*    for (int i = 0; i < nHeight; ++i)
*    {
*        for (int j = 0; j < nWwidth - 1; ++j)
*        {
*            int rows = imgInput.at<uchar>(i, j);
*            int cols = imgInput.at<uchar>(i, j + 1);
*            imgGLCM.at<uchar>(rows, cols)++;
*        }
*    }
        *regions  要检查的区域。
        *Image 灰度值图像。
        *LdGray 要区分的灰度值的数量 1, 2, 3, 4, 5, 6, 7, 8
        *Direction  矩阵的计算方向 0, 45, 90, 135, 'mean'
        *Energy 灰度值能量
        *Correlation 灰度值的相关性。
        *Homogeneity 灰度值的局部同质性。
        *Contrast 灰度值对比度。
    cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)
    Mask := Energy [<=] 0.05
    select_mask_obj (Basins, Defects, Mask)
    * 
    dev_display (Image)
    dev_display (Defects)
    count_obj (Defects, NDefects)
    disp_message (WindowHandle, NDefects + ' \'mura\' defects detected', 'window', 12, 12, 'red', 'true')
    if (F < 2)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor

案例3

Halcon 缺陷检测 金属拉丝表面缺陷检测(乘法增强、傅里叶变换与卷积、纹理过滤、动态阈值)_halcon 卷积_廷益--飞鸟的博客-CSDN博客

 


* 1.读取图片并显示 ****************************
dev_close_window ()
read_image (Image, './4.png')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowHandle)

dev_display (Image)

* 2.图片对比度增强 ****************************
* 转换为灰度图片
rgb1_to_gray (Image, GrayImage)
* 图片取反
invert_image (GrayImage, ImageInvert)
* 图片增强(乘法)
mult_image (ImageInvert, ImageInvert, ImageResult, 0.01, 0)

* 3.傅里叶变换 ****************************
* 生成正弦卷积 滤波图片
gen_sin_bandpass (ImageBandpass, 0.6, 'none', 'rft', Width, Height)

* 傅里叶 图片转到 频域
rft_generic (ImageResult, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 卷积处理
convol_fft (ImageFFT, ImageBandpass, ImageConvol)
* 傅里叶 频域转到图片 
rft_generic (ImageConvol, ImageBase, 'from_freq', 'n', 'byte', Width)

* 4.纹理过滤与动态阈值 ****************************
* 纹理过滤器
texture_laws (ImageBase, ImageTexture, 'el', 3, 5)
* 动态阈值
mean_image (ImageTexture, ImageMean, 5, 10)
dyn_threshold (ImageTexture, ImageMean, RegionDynThresh, 10, 'light')
* 连通域分析
connection (RegionDynThresh, ConnectedRegions)
* 区域筛选
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 44, 487)

* 链接缺陷区域
union1 (SelectedRegions, RegionUnion)
closing_circle (RegionUnion, RegionClosing, 6)

* 区域骨骼化处理
skeleton (RegionClosing, Skeleton)

* 5.结果显示 ****************************
dev_clear_window ()
dev_display(Image)
dev_set_color ('red')
dev_display(Skeleton)
stop()

案例4

 https://libaineu2004.blog.csdn.net/article/details/103883788https://libaineu2004.blog.csdn.net/article/details/105366681icon-default.png?t=N7T8https://libaineu2004.blog.csdn.net/article/details/105366681

 


*1采集图像
read_image (Image66, './5.png') 
rgb1_to_gray (Image66, GrayImage)
 
*2预处理之拉开对比度(这里采用频域,频域到空间域的常用算子有三个fft_iamge,rft_generic,fft_generic 
fft_generic (GrayImage, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
 
*注意一般在频域里就是选择你想要的频段而已,被称为滤波,这个手法在halcon中有三个,
*一个是直接手画,然后paint_region
*一个是涉及滤波器,然后进行滤波,这个对于初学者有点难度,先掌握常见滤波器。
*第三个就是调用power_real,对其进行blob解析。
*这里用的直接手动paint_region,选择对应的频段 
gen_rectangle1 (ROI_0, 200.855, 3.85433, 273.273, 1101.15)
paint_region (ROI_0, ImageFFT, ImageResult, 0, 'fill') 
 
*注意这里又回到了空间,频域和空间是同等重要地位,只是看问题的角度不一样,这也符合唯物辩证法法
fft_generic (ImageResult, ImageFFT1, 'from_freq', 1, 'sqrt', 'dc_center', 'byte') 
*接下来就是一个blob提取而已,当然这里方法可以根据情况变化多端,比如你可以分水领域法,
*然后调用select_gray,对每个区域对应灰度值特征进行筛选,当然您也可以用共生矩阵
emphasize (ImageFFT1, ImageEmphasize, 7, 7, 1) 
threshold (ImageEmphasize, Regions, 44, 101)
dilation_circle (Regions, RegionDilation, 3.5) 
connection (RegionDilation, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 78.88, 190.87) 
*这里就是显示而已
dev_display (Image66) 
dev_display (SelectedRegions)

案例5

 

*清空当前窗口
dev_close_window ()
*读取测试图像
read_image (Image,'./1.png')
*获取图像的宽
get_image_size (Image, Width, Height)
*创建显示窗口,并设置窗口及绘制参数
dev_open_window_fit_size (0, 0, Width, Height, -1, -1, WindowHandle)
dev_display (Image)
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('red')
*创建一个高斯滤波器,用于将傅里叶转换后的图像进行滤波
gen_gauss_filter (GaussFilter, 3.0, 3.0, 0.0, 'none', 'rft', Width, Height)
*开始检测
*将测试图像转化为单通道的灰度图像
rgb1_to_gray (Image, ImageGray)
*对灰度图像进行颜色反转
invert_image (ImageGray, ImageInvert)
*对反转后的图像进行傅里叶变换
rft_generic (ImageInvert, ImageFFT, 'to_freq', 'none', 'complex', Width)
*对傅里叶图像做卷积,使用之前创建的高斯滤波器作为卷积核
convol_fft (ImageFFT, GaussFilter, ImageConvol)
*将卷积后的傅里叶图像还原为空间域图像。可见图像的突变部分得到了增强
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
*设置提取线条的参数
calculate_lines_gauss_parameters (17, [25,3], Sigma, Low, High)
*将图像中的有灰度差异的线条提取出来
lines_gauss (ImageFiltered, Lines, Sigma, Low, High, 'dark', 'true', 'gaussian', 'true')
*将提取出的结果显示出来
dev_display (Image)
dev_display (Lines)

案例6

 

dev_update_off ()
dev_close_window ()
* 读图像
read_image (Image, './2.png')
*彩色转灰度图
count_channels (Image, Channels)
if (Channels == 3 or Channels == 4)
    rgb1_to_gray (Image, Image)
endif
* 翻转图像,亮变暗  暗变量
invert_image (Image, ImageInverted)
* 获取图像宽高
get_image_size (Image, Width, Height)
* dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
* 
* Optimize the speed of the fast fourier transform
* 优化快速傅里叶变换的速度
* Enhance the scratches by filtering in the frequency domain
* 通过在频域中滤波来增强划痕
 
* 生成具有正弦形状的带通滤波器
gen_sin_bandpass (ImageBandpass, 0.4, 'none', 'rft', Width, Height)
* 对一幅图片的实部进行快速傅里叶变换的计算,将图像转为傅里叶图像
* 参数为'to_freq',输出图像为复数形式
* ImageInverted:输入的图片(输入图像需要为背景为暗,前景为亮的图像,一般需要先要将原始图像反转)
* ImageFFT:傅里叶变换后输出的图片
* 'to_freq':变换方向,傅里叶变换
* 'none':变换因子的规范
* 'complex':输出图片的数据类型,输出图像为复数形式
* Width: 图像的宽
rft_generic (ImageInverted, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 对图片用滤波器在频域进行卷积运算
* ImageFFT: 输入的图片
* ImageBandpass:频域滤波器
* ImageConvol:计算后的输出图像
convol_fft (ImageFFT, ImageBandpass, ImageConvol)
* 对滤波后的图片进行傅里叶反变换
* 参数为'from_freq',输入图像为复数形式
rft_generic (ImageConvol, Lines, 'from_freq', 'n', 'byte', Width)
* 
* Segment the scratches by using morphology
* 使用形态分割划痕
 
* 二值化
threshold (Lines, Region, 5, 255)
* 获得连通域
connection (Region, ConnectedRegions)
* 特征直方图,按照面积特征选择区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5, 5000)
* 膨胀
dilation_circle (SelectedRegions, RegionDilation, 5.5)
* 区域联合成一个区域
union1 (RegionDilation, RegionUnion)
* 抠图
reduce_domain (Image, RegionUnion, ImageReduced)
* 检测线条及其宽度
* 输出亚像素直线轮廓
lines_gauss (ImageReduced, LinesXLD, 0.8, 3, 5, 'dark', 'false', 'bar-shaped', 'false')
* 联合直线亚像素轮廓
union_collinear_contours_xld (LinesXLD, UnionContours, 40, 3, 3, 0.2, 'attr_keep')
* 按照轮廓的总长度来选择亚像素轮廓
select_shape_xld (UnionContours, SelectedXLD, 'contlength', 'and', 15, 1000)
* 由亚像素轮廓生成区域
gen_region_contour_xld (SelectedXLD, RegionXLD, 'filled')
* 区域联合
union1 (RegionXLD, RegionUnion)
* 膨胀
dilation_circle (RegionUnion, RegionScratches, 10.5)
* 
* Display the results
* 显示标记出来的的直线划痕
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_colored (12)
dev_display (Image)
dev_display (RegionScratches)

案例7

 


*http://www.ihalcon.com/read-13031-1.html
*缺陷检测,将木板的划痕提取出来
dev_update_off ()
dev_close_window ()
read_image (Image, './3.png')
*彩色转灰度图
count_channels (Image, Channels)
if (Channels == 3 or Channels == 4)
    rgb1_to_gray (Image, Image)
endif
get_image_size (Image, Width, Height)
dev_open_window_fit_size (0, 0, Width, Height, -1, -1, WindowHandle)
dev_display (Image)
*傅里叶变换去背景
fft_generic (Image, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
gen_rectangle2 (Rectangle1, 360.5, 176.56, rad(-0), 179.4, 7.725)
gen_rectangle2 (Rectangle2, 360.955, 216, rad(-90), 180.765, 4.68)
union2 (Rectangle1, Rectangle2, UnionRectangle)
paint_region (UnionRectangle, ImageFFT, ImageResult, 0, 'fill')
fft_generic (ImageResult, ImageFFT1, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')
*提取划痕
threshold (ImageFFT1, Regions, 6, 239)
closing_circle (Regions, RegionClosing, 2.5)
connection (RegionClosing, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 110, 99999)
union1 (SelectedRegions, RegionUnion)
closing_circle (RegionUnion, RegionClosing1, 3.5)
connection (RegionClosing1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, ['width','height','area'], 'and', [25,20,140], [400,400,900])
dilation_rectangle1 (SelectedRegions1, RegionDilation1, 15, 15)
union1 (RegionDilation1, RegionUnion2)
connection (RegionUnion2, ConnectedRegions2)
select_shape (ConnectedRegions2, SelectedRegions2, 'area', 'and', 1250, 99999)
union1 (SelectedRegions2, RegionUnion1)
skeleton (RegionUnion1, Skeleton)
*显示
dev_set_color ('red')
dev_display (Image)
dev_display (Skeleton)

案例8 

【愚公系列】2023年04月 Halcon机器视觉-15种常用缺陷检测实例_halcon例子-CSDN博客

*=====================================================
* 关闭窗口
dev_close_window ()
*关闭程序计数器,图形变量更新,窗口图形更新
dev_update_off ()
*设置图像路径
Path := 'lcd/mura_defects_blur_'
*读取一张图像
read_image (Image, Path + '01')
*获取图像大小
get_image_size (Image, Width, Height)
*创建一个新窗体
dev_open_window_fit_size (0, 0, Width, Height, 640, 480, WindowHandle)
*设置字体信息:字体大小为16,字体为mono,粗体,斜体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*设置区域的填充方式
dev_set_draw ('margin')
*设置线宽度
dev_set_line_width (3)
*设置输出对象的显示颜色
dev_set_color ('red')
ScaleFactor := 0.4





*calculate_lines_gauss_parameters    根据要提取线的最大宽度以及对比度计算出lines_gauss算子输入的Sigma、Low、High值
     *MaxLineWidth (input_control) : lines_gauss要提取线条的最大宽度
     *Contrast (input_control) :lines_gauss要提取线的对比度。Contrast 值不仅可以一个,也可以为两个。当值为两个时,数组中的第二个值是要提取线的最小对比度,并且其值不能大于第一个值。比如:[20,10]
     *Sigma (output_control) :获取用于lines_gauss输入的Sigma值
     *Low (output_control):获取用于lines_gauss输入的Low 值
     *High (output_control) :获取用于lines_gauss输入的High 值
*获取lines_gauss算子Sigma, Low, High三个参数值
calculate_lines_gauss_parameters (17, [25,3], Sigma, Low, High)
for f := 1 to 3 by 1
    *读取一张图像  1=>'01'
    read_image (Image, Path + f$'.2i') 
    *获取彩色图像的R,G,B三分量
    decompose3 (Image, R, G, B)
    * *将图像转化为频域图像
    rft_generic (B, ImageFFT, 'to_freq', 'none', 'complex', Width)
    *生成一个高斯滤波核
    gen_gauss_filter (ImageGauss, 100, 100, 0, 'n', 'rft', Width, Height)
    *将频域图像核高斯滤波核进行卷积运算
    convol_fft (ImageFFT, ImageGauss, ImageConvol)
    *将卷积后的图像转换为空间域图像
    rft_generic (ImageConvol, ImageFFT1, 'from_freq', 'none', 'byte', Width)
    *用缺陷图像减去背景图像(时域图像)
    sub_image (B, ImageFFT1, ImageSub, 2, 100)
    * 对上述图像进行抽点,变焦
    zoom_image_factor (ImageSub, ImageZoomed, ScaleFactor, ScaleFactor, 'constant')
    *获取变焦后的图像的ROI
    get_domain (ImageZoomed, Domain)
    *图像ROI进行腐蚀操作
    erosion_rectangle1 (Domain, RegionErosion, 7, 7)
    *获取变焦图像中ROI区域内的图像
    reduce_domain (ImageZoomed, RegionErosion, ImageReduced)
    *探测线和获取线宽度
    lines_gauss (ImageReduced, Lines, Sigma, Low, High, 'dark', 'true', 'gaussian', 'true')
    *生成一个2D的齐次变换矩阵
    hom_mat2d_identity (HomMat2DIdentity)
    *添加一个缩放因子到齐次变换矩阵
    hom_mat2d_scale_local (HomMat2DIdentity, 1 / ScaleFactor, 1 / ScaleFactor, HomMat2DScale)
    *仿射变换
    affine_trans_contour_xld (Lines, Defects, HomMat2DScale)
    * 显示图像
    dev_display (Image)
    * 显示线缺陷
    dev_display (Defects)
    
    stop ()
    
endfor

 

 案例9

案例10

案例11 

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Halcon是一种常用的图像处理软件,可以用于各种缺陷检测任务。在Halcon中,可以使用不同的算法和技术来进行缺陷检测。根据引用\[1\]中提供的实例,Halcon可以用于背景网格产品刮伤缺陷检测、不均匀表面刮伤检测、产品表面三角缺陷检测、产品毛刺检测、产品上凹坑检测、产品周围缺口检测、电路板短路、断路检测、找出所有网格顶点的位置、化妆品标签褶皱检测、皮革纹理表面缺陷检测、手机摄像头图像表面的轻微缺陷检测、网状产品表面破损检测、铣刀刀口破损缺陷检测和检测印刷数字是否完整等任务。 根据引用\[2\]中的描述,缺陷检测是一项具有挑战性的任务,需要保证稳定性和精度。传统的算法检测缺陷通常需要进行复杂的调试和参数调整,而且容易出现检测不稳定和误测的情况。机器学习和深度学习成为缺陷检测领域的重要技术难点。机器学习方法通常使用类似MLP的神经网络对缺陷特征进行训练和分类。深度学习方法则需要大量的缺陷样本进行训练,并且需要手动标注缺陷位置,训练周期较长。迁移学习法是一种新兴的方法,可以利用已经训练好的网络模型进行缺陷检测。 在日常工程应用中,Halcon通常使用形状匹配进行定位,但当待匹配物体有较大变形时,形状匹配的结果可能不准确,特别是在塑料产品成形时变形或纺织产品因褶皱而变形的情况下。这时需要采用其他方法来获得精确的定位结果。 综上所述,Halcon可以应用于各种缺陷检测任务,并且可以根据具体情况选择合适的算法和技术来实现精确的检测结果。 #### 引用[.reference_title] - *1* [【愚公系列】2023年04月 Halcon机器视觉-15种常用缺陷检测实例](https://blog.csdn.net/aa2528877987/article/details/129943049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [基于halcon缺陷检测常用方法与示例总结](https://blog.csdn.net/weixin_50016546/article/details/124981131)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值