zoukankan      html  css  js  c++  java
  • 图像处理笔记(十七):再看傅里叶变换

    傅里叶变换

    1. 快速傅里叶正逆变换的两对算子:

      1. fft_image和fft_image_inv:分别是把图像变换到傅里叶频谱图和把傅里叶频谱图变换为图像
      2. fft_generic(Image, ImageFFT, Direction, Exponent, Norm, Mode, ResultType)
        这个算子通过不同的Direction来做正逆变换。Direction:to_freq,Exponent:-1;Direction:from_freq,Exponent:1
    2. gen_lowpass(ImageLowpass, Frequency, Norm, Mode, Width, Height)
      生成一个低通滤波器,截至频率在0-1之间可选,长宽应当与需要做滤波的图像长宽一致,这个低通滤波器应当作用于频率域,可以用来消除周期噪声。
      这里的mode应当与原图像做fft变换时的mode一致。
      截止频率越小,对噪声的消除作用越好,但是图像会越模糊。截止频率代表了滤波后图像中心椭圆区域的大小,看图:
      图像分别是原图和使用0.1和使用0.5截止频率滤波的图像及傅里叶频谱图

    3. gen_highpass(ImageHighpass, Frequency, Norm, Mode, Width, Height)
      构造一个高通滤波器,参数和低通滤波器相似,用高通滤波器做频率域滤波后,只有中心的亮区域被过滤掉了,剩下的是周围的区域,从频谱图上看,正好与低通滤波器相反。
      高通滤波器用来锐化图像,不能做噪声过滤。

    4. binomial_filter(Image, ImageBinomial, MaskWidth, MaskHeight)
      使用二项式滤波光滑处理图像。需要注意的点在于halcon中已经定义好的filter往往可以直接作用在图像上,而不能作用在频谱图上(像素类型为complex)。

    一个频率域滤波消除噪声的例子,使用两种方法:

    1. 直接使用一个低通滤波器
    2. 找出频谱图上较亮的非中心亮区域,将这些区域过滤掉。
      使用了一幅没有明显噪声的图像叠加了一幅仅含有周期性噪声的图像作为原图像。
    read_image(Image3, 'Fig0222(a)(face)')
    
    * 将图像大小转换成和噪声图像一样大
    zoom_image_size(Image3, ImageZoom, Width, Height, 'constant')
    * 图像与噪声图像叠加,代码中省略了噪声图像的构造过程
    add_image(ImageResult2, ImageZoom, ImageAdd, 1, 0)
    fft_image(ImageAdd, ImageFFT5)
    fft_image(ImageZoom, ImageFFT6)
    
    * 方法1,构造一个低通滤波器滤波
    gen_lowpass(ImageLowpass1, 0.2, 'none', 'dc_center', Width, Height)
    convol_fft(ImageFFT5, ImageLowpass1, ImageConvol2)
    * 滤波后的结果
    fft_image_inv(ImageConvol2, ImageFFTInv3)
    
    * 方法2
    * 使用二项式滤波光滑图像
    binomial_filter(ImageResult3, ImageSmooth, 9, 9)
    * 筛选出亮点
    threshold(ImageSmooth, Region, 100, 1800)
    connection(Region, ConnectedRegions)
    select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 5, 100)
    union1(SelectedRegions, RegionUnion)
    reduce_domain(ImageSmooth, RegionUnion, ImageReduced)
    * 检测出区域内的局部最大值,这里可以检测出每个亮点区域中最亮的点
    local_max(ImageReduced, LocalMaxima)
    dilation_circle(LocalMaxima, RegionDilation, 12.5)
    * 把上面找出来的这些膨胀后的亮区域涂成黑色(可以理解为把这些区域过滤掉了)
    paint_region(RegionDilation, ImageFFT5, ImageResult4, 0, 'fill')
    * 效果图
    fft_image_inv(ImageResult4, ImageFFTInv4)
    


    四张图分别是原图,叠加噪声后的图,方法1的效果图,方法2的效果图。

    # 边缘分析
    __Halcon中轮廓线窗口的使用__ :
    打开轮廓线窗口,点击窗口左上角的绘制线段(或绘制弧形),在原图像上绘制线段,绘制完成后鼠标右击,就可以在轮廓线窗口上看到这条线上灰度值的变化
    
    halcon中有多种现成的求边缘的算子,他们之间主要的区别是使用了不同的滤波器来提取轮廓。
    ```
    read_image(Image, 'Fig0219(rose1024)')
    
    laplace_of_gauss(Image, ImageLaplace, 2)
    threshold_sub_pix(ImageLaplace, Border, -2)
    
    derivate_gauss(Image, DerivGauss, 0.6, 'gradient')
    threshold_sub_pix(DerivGauss, Border1, 15)
    
    frei_amp(Image, ImageEdgeAmp)
    threshold_sub_pix(ImageEdgeAmp, Border2, 50)
    
    prewitt_amp(Image, ImageEdgeAmp1)
    threshold_sub_pix(ImageEdgeAmp1, Border3, 90)
    
    sobel_amp(Image, EdgeAmplitude, 'sum_abs', 3)
    threshold_sub_pix(EdgeAmplitude, Border4, 35)
    
    kirsch_amp(Image, ImageEdgeAmp2)
    threshold_sub_pix(ImageEdgeAmp2, Border5, 110)
    
    robinson_amp(Image, ImageEdgeAmp3)
    threshold_sub_pix(ImageEdgeAmp3, Border6, 120)
    ```
    使用高斯光滑的拉普拉斯算子最特别,会出现一些负数值,这个值应该不是灰度,而是导数。
    
    ## 轮廓的分割合并
    上面的求轮廓的算子最终求出来的都是一些不连续的边缘,需要进一步将这些边缘做分割合并。
    边缘拟合用于将轮廓线拟合成直线/圆/椭圆。算子普遍以fit_开头,contour_xld结尾;
    轮廓合并用于将距离较近的轮廓合并到一起,算子一般以union_开头,contours_xld结尾;
    轮廓分割:segment_contoures_xld,将轮廓分割为直线/直线和圆弧
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  分割线  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # 标定
    目的是减弱相机拍摄引起的图形畸变。
    我决定先跳过这一节
    
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  分割线  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # 模板匹配
    这个知识点的实用性比较强。
    
    书上的灰度匹配的算子已经弃用了。
    做了一个小实验,用一个一条边和y轴重合的等边三角形做的模板,去在一幅图上找匹配,这幅图上有一个旋转角度和模板一致的等边三角形和一个底边和x轴平行的等边三角形,结果前一个三角形匹配上了。这也是在预期之中的。
    ```
    gen_contour_polygon_xld(Contour, [0, 100, 50, 0], [0, 0, 50 * sqrt(2), 0])
    gen_contour_polygon_xld(Contour1, [200, 50 * sqrt(2) + 200, 50 * sqrt(2) + 200, 200], [50, 0, 100, 50])
    
    gen_region_contour_xld(Contour, Region, 'filled')
    gen_region_contour_xld(Contour1, Region1, 'filled')
    
    gen_image_const(Image, 'byte', 512, 512)
    overpaint_region(Image, Region, 100, 'fill')
    overpaint_region(Image, Region1, 200, 'fill')
    
    gen_image_const(Image1, 'byte', 100, 100)
    overpaint_region(Image1, Region, 255, 'fill')
    
    create_shape_model(Image1, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
    find_shape_model(Image, ModelID, -0.39, 0.79, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
    ```
  • 相关阅读:
    [SQL] 外卖系统数据库设计
    [PHP] 遗传算法求函数最大值一般实现
    PHP CURL根据详细地址获取腾讯地图经纬度
    PHP 递归读取无限级分类
    PHP 仿网易云的评论盖楼
    JavaScript清除空格、换行,把双引号转换成单引号
    百度地图小Demo---获取当前地址以及拖拽显示地址
    基于Modbus的C#串口调试开发
    二叉树的中序遍历
    二叉树的前序遍历
  • 原文地址:https://www.cnblogs.com/yutou2016/p/11171903.html
Copyright © 2011-2022 走看看