图像灰度处理与边缘检测

图片是从网上下载,先将其处理为灰度图像,之后进行边缘检测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#ifndef INITIAL_OPENGL
#define INITIAL_OPENGL
 
#include"vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
 
#endif
 
//转为灰度和滤波
int main()
{
    vtkSmartPointer<vtkJPEGReader> reader1 =
        vtkSmartPointer<vtkJPEGReader>::New();
    reader1->SetFileName("D:\\QTData\\Vtk-new\\figure2.jpg");
    reader1->Update();
 
    //图像灰度化
    vtkSmartPointer<vtkImageLuminance> luminanceFilter =
        vtkSmartPointer<vtkImageLuminance>::New();
    luminanceFilter->SetInputConnection(reader1->GetOutputPort());
    luminanceFilter->Update();
 
    //计算图像梯度
    vtkSmartPointer<vtkImageGradient> imgGradient =
        vtkSmartPointer<vtkImageGradient>::New();
    imgGradient->SetInputConnection(luminanceFilter->GetOutputPort());
    imgGradient->SetDimensionality(2);//图像维数
 
    //计算梯度向量的2范数,即向量的模
    vtkSmartPointer<vtkImageMagnitude> imgMagnitude =
        vtkSmartPointer<vtkImageMagnitude>::New();
    imgMagnitude->SetInputConnection(imgGradient->GetOutputPort());
    imgMagnitude->Update();
 
    double Range[2];
    vtkSmartPointer<vtkImageData> getRange =
        vtkSmartPointer<vtkImageData>::New();
    imgMagnitude->GetOutput()->GetScalarRange(Range);//图像灰度范围最小值、最大值
 
    //调整图像的数据范围
    vtkSmartPointer<vtkImageShiftScale> imgShiftScale =
        vtkSmartPointer<vtkImageShiftScale>::New();
    imgShiftScale->SetOutputScalarTypeToUnsignedChar(); //强制类型转换 0~255
    imgShiftScale->SetScale(255 / Range[1]); //灰度映射间距
    imgShiftScale->SetInputConnection(imgMagnitude->GetOutputPort());
    imgShiftScale->Update();
 
     
        vtkSmartPointer<vtkImageActor> origActor =
        vtkSmartPointer<vtkImageActor>::New();
    origActor->SetInputData(reader1->GetOutput());
 
    vtkSmartPointer<vtkImageActor> GradientActor =
        vtkSmartPointer<vtkImageActor>::New();
    GradientActor->SetInputData(imgShiftScale->GetOutput());
 
    double origView[4] = { 0, 0, 0.5, 1 };
    double gradientView[4] = { 0.5, 0, 1, 1 };
    vtkSmartPointer<vtkRenderer> origRender =
        vtkSmartPointer<vtkRenderer>::New();
    origRender->SetViewport(origView);
    origRender->AddActor(origActor);
    origRender->ResetCamera();
    origRender->SetBackground(1.0, 0, 0);
 
    vtkSmartPointer<vtkRenderer> gradientRender =
        vtkSmartPointer<vtkRenderer>::New();
    gradientRender->SetViewport(gradientView);
    gradientRender->AddActor(GradientActor);
    gradientRender->ResetCamera();
    gradientRender->SetBackground(1, 1, 1);
 
    vtkSmartPointer<vtkRenderWindow> rw =
        vtkSmartPointer<vtkRenderWindow>::New();
    rw->AddRenderer(origRender);
    rw->AddRenderer(gradientRender);
    rw->SetSize(640, 320);
    rw->SetWindowName("Image Gradient");
 
    vtkSmartPointer<vtkRenderWindowInteractor> rwi =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleImage> style =
        vtkSmartPointer<vtkInteractorStyleImage>::New();
    rwi->SetRenderWindow(rw);
    rwi->SetInteractorStyle(style);
    rwi->Initialize();
    rwi->Start();
 
    return 0;
}

  实现结果如下图所示:

 

 参考:https://www.cnblogs.com/ybqjymy/p/14241281.html

    https://blog.csdn.net/shenziheng1/article/details/54747184

posted @   二先生-  阅读(246)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示