一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

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时进行扩散处理。
下图是进行各向异性扩散滤波处理的结果:
posted on 2021-01-06 15:46  一杯清酒邀明月  阅读(584)  评论(0编辑  收藏  举报