• 基于FFT的瑕疵检测


    1.思路
    FFT变换 -> 卷积滤波(得到图像的高频成分) -> FFT逆变换 -> 简单阈值分析选取即可
    2.名词解释
    图像的时域形式:我理解为是我们人眼所观察到的图像的一种能量的表现形式,感性的表现,定性;
    图像的频域形式:频域就是图像的理性的表现,定量,图像的大部分能量集中在低,中频,高频部分的分量很弱;
    FFT变换:快速傅立叶变换(fast Fourier transform),简单的理解就是将图像从时域变成频域;
    图像的高频:亮度或灰度变化激烈的地方对应高频成分,如边缘,瑕疵点;
    图像的低频:变化不大的地方对于低频成分,如大片色块区;
    卷积滤波:空域的一个抽象运算转换成频域的一个简单数学乘法,这里我们将它理解为一种滤波,滤去低频得到高频(频率越高灰度值越高,图像越白);
    FFT逆变换:将图像从频域变成时域,就是将滤波后的频域变换成时域,即将高频部分选取出来后的时域图像。
     
    打广告时间:欢迎加入QQ群(Halcon交流+资料分享102389338(已满),2号Halcon交流+资料分享854753781

     
    [dengfenghai于2019-07-17 16:52编辑了帖子]

    3.程序

    * 窗口设置

    dev_update_off ()

    dev_close_window ()

    read_image (Image, 'fft.jpg')

    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')

    *

    * 优化特定图像大小的FFT速度,实值FFT的运行时间优化。

    optimize_rft_speed (Width, Height, 'standard') 

    * 结合两个高斯构造一个合适的滤波器

    * 滤波器

    Sigma1 := 12.0

    Sigma2 := 3.0

    * 在频域中生成高斯滤波器。

    gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)

    gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height)

    * 两个图像相减。

    sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)

    rgb1_to_gray (Image, Image)

      

    * 在频域执行卷积

    * 计算图像的实值快速傅立叶变换。 to_freq 傅里叶变换

    rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)

    *在频域中用滤波器卷积图像。

    convol_fft (ImageFFT, Filter, ImageConvol)

    * 计算图像的实值快速傅里叶变换。from_freq 傅里叶逆变换

    rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)

     

    * 确定矩形中的灰度值范围。

    gray_range_rect (ImageFiltered, ImageResult, 10, 10)

    * 确定区域内的最小和最大灰度值

    min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)

    * 使用全局阈值分割图像。

    threshold (ImageResult, RegionDynThresh, max([2.55,Max * 0.25]), 255)

    * 连通性分析

    connection (RegionDynThresh, ConnectedRegions)

    * 根据特性选取区域,这里根据area

    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)

    * 显示设置

    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')

  • 相关阅读:
    web漏洞之SQL注入
    web漏洞之文件包含
    web漏洞之文件上传
    CVE-2020-1938 Apache-Tomcat-Ajp漏洞复现
    web漏洞之命令执行
    web漏洞之XXE
    web漏洞之CORS
    web漏洞之SSRF
    web漏洞之CSRF
    web漏洞之XSS
  • 原文地址:https://www.cnblogs.com/wwwbdabc/p/11678136.html
Copyright © 2020-2023  润新知