zoukankan      html  css  js  c++  java
  • VTK 图像平滑_各向异性滤波

    1.各向异性扩散滤波

    高斯平滑方法在平滑噪声的同时,模糊了图像的重要边缘图像。
    各向异性滤波是一种基于偏微分方程的滤波技术,建立于热量的各向异性扩散理论。
    各向异性滤波在图像的平坦区域选择大尺度平滑,而边缘区域则选择小尺度的平滑,在抑制噪声的同时保持了图像的边缘信息。
    vtkImageAnisotropicDiffusion2D(vtkImageAnisotropicDiffusion3D)实现图像各向异性扩散滤波,代码如下:
     1 #include <vtkAutoInit.h>
     2 VTK_MODULE_INIT(vtkRenderingOpenGL);
     3  
     4 #include <vtkSmartPointer.h>
     5 #include <vtkJPEGReader.h>
     6 #include <vtkImageCast.h>
     7 #include <vtkImageAnisotropicDiffusion2D.h>
     8 #include <vtkImageActor.h>
     9 #include <vtkCamera.h>
    10 #include <vtkRenderer.h>
    11 #include <vtkRenderWindow.h>
    12 #include <vtkRenderWindowInteractor.h>
    13 #include <vtkInteractorStyleImage.h>
    14  
    15 int main()
    16 {
    17     vtkSmartPointer<vtkJPEGReader> reader =
    18         vtkSmartPointer<vtkJPEGReader>::New();
    19     reader->SetFileName("lena.jpg");
    20  
    21     vtkSmartPointer<vtkImageAnisotropicDiffusion2D> diffusion =
    22         vtkSmartPointer<vtkImageAnisotropicDiffusion2D>::New();
    23     diffusion->SetInputConnection(reader->GetOutputPort());
    24     diffusion->SetNumberOfIterations(100);
    25     diffusion->SetDiffusionThreshold(5); //小于该阈值扩散
    26     diffusion->Update();
    27     /
    28     vtkSmartPointer<vtkImageActor> originalActor =
    29         vtkSmartPointer<vtkImageActor>::New();
    30     originalActor->SetInputData(reader->GetOutput());
    31  
    32     vtkSmartPointer<vtkImageActor> diffusionActor =
    33         vtkSmartPointer<vtkImageActor>::New();
    34     diffusionActor->SetInputData(diffusion->GetOutput());
    35     
    36     double leftViewport[4] = { 0.0, 0.0, 0.5, 1.0 };
    37     double rightViewport[4] = { 0.5, 0.0, 1.0, 1.0 };
    38  
    39     vtkSmartPointer<vtkCamera> camera =
    40         vtkSmartPointer<vtkCamera>::New();
    41     vtkSmartPointer<vtkRenderer> leftRenderer =
    42         vtkSmartPointer<vtkRenderer>::New();
    43     leftRenderer->SetViewport(leftViewport);
    44     leftRenderer->AddActor(originalActor);
    45     leftRenderer->SetBackground(1.0, 0, 0);
    46     leftRenderer->SetActiveCamera(camera);
    47     leftRenderer->ResetCamera();
    48  
    49     vtkSmartPointer<vtkRenderer> rightRenderer =
    50         vtkSmartPointer<vtkRenderer>::New();
    51     rightRenderer->SetViewport(rightViewport);
    52     rightRenderer->SetBackground(1.0, 1.0, 1.0);
    53     rightRenderer->AddActor(diffusionActor);
    54     rightRenderer->SetActiveCamera(camera);
    55     /
    56     vtkSmartPointer<vtkRenderWindow> rw =
    57         vtkSmartPointer<vtkRenderWindow>::New();
    58     rw->AddRenderer(leftRenderer);
    59     rw->AddRenderer(rightRenderer);
    60     rw->SetSize(640, 320);
    61     rw->SetWindowName("Smooth by AnistropicFilter");
    62  
    63     vtkSmartPointer<vtkRenderWindowInteractor> rwi =
    64         vtkSmartPointer<vtkRenderWindowInteractor>::New();
    65     vtkSmartPointer<vtkInteractorStyleImage> style =
    66         vtkSmartPointer<vtkInteractorStyleImage>::New();
    67     rwi->SetInteractorStyle(style);
    68     rwi->SetRenderWindow(rw);
    69     rwi->Initialize();
    70     rwi->Start();
    71  
    72     return 0;
    73 }
    vtkImageAnisotropicDiffusion2D类通过迭代方法实现。
    其中SetNumberOfIterations()用于设置迭代的次数;
    各向异性扩散滤波原理是在梯度较小的像素处进行较大幅度扩散,而在大梯度处则只进行细微的扩散。因此需要设置一个扩算的阈值DiffusionThreshold,这个阈值与图像的梯度有关。SetDiffusionThreshold()即是用来设置扩散阈值。该类中还有一个梯度标志GradientMagnitudeThreshold,用来设置梯度算子。当该标志开时梯度通过中心差分方法计算;当标志为关时,需要单独处理每个相邻像素。当像素与相邻像素梯度小于DiffusionThreshold时进行扩散处理。
    下图是进行各向异性扩散滤波处理的结果:
  • 相关阅读:
    让源码包apache服务被服务管理命令识别
    zabbix客户端监控脚本shell
    zabbix指定版本自动化安装脚本shell
    haproxy配置详解
    HAproxy 让后端RS记录真实IP
    Centos 7.x系统下忘记用户登录密码,重置root密码的方法
    Win2008 server R2重置登录密码Administrator
    序列自动机总结与例题
    整体二分总结
    容易推错的式子
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14241513.html
Copyright © 2011-2022 走看看