参考大神博客:VTK修炼之道31:图像二值化_阈值法_二值化阈值_沈子恒的博客-CSDN博客
vtkImageThreshold中设置临界值、如果大于这个临界值,输出的像素就是255,如果小于这个临界值,输出的像素就是0。
上代码:
#include <vtkAutoInit.h>
#include <vtkSmartPointer.h>
#include <vtkJPEGReader.h>
#include <vtkImageThreshold.h>
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
void main()
{
vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();
reader->SetFileName("234.jpg");
reader->Update();
//二值化阈值,设置如通过大于90的所有像素输出值为255,而小于90的像素值为0
vtkSmartPointer<vtkImageThreshold> vtkThreshould = vtkSmartPointer<vtkImageThreshold>::New();
vtkThreshould->SetInputConnection(reader->GetOutputPort());
vtkThreshould->ThresholdByUpper(90);//设置二值化的界限值
vtkThreshould->SetInValue(255);
vtkThreshould->SetOutValue(0);
vtkThreshould->Update(); //算法执行后必须添加更新消息!!!
vtkSmartPointer<vtkImageActor> origActor = vtkSmartPointer<vtkImageActor>::New();
origActor->SetInputData(reader->GetOutput());
vtkSmartPointer<vtkImageActor> threshouldActor = vtkSmartPointer<vtkImageActor>::New();
threshouldActor->SetInputData(vtkThreshould->GetOutput());
double origView[4] = { 0, 0, 0.5, 1 };
double threshouldView[4] = { 0.5, 0, 1, 1 };
vtkSmartPointer<vtkRenderer> origRender = vtkSmartPointer<vtkRenderer>::New();
origRender->SetViewport(origView);
origRender->AddActor(origActor);
origRender->ResetCamera();
origRender->SetBackground(0, 0, 0);
vtkSmartPointer<vtkRenderer> threshouldRender = vtkSmartPointer<vtkRenderer>::New();
threshouldRender->SetViewport(threshouldView);
threshouldRender->AddActor(threshouldActor);
threshouldRender->ResetCamera();
threshouldRender->SetBackground(0, 0, 0);
vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(origRender);
renderWindow->AddRenderer(threshouldRender);
renderWindow->SetSize(640, 240);
renderWindow->Render();
renderWindow->SetWindowName("Threshould Image");
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();
interactor->SetInteractorStyle(style);
interactor->SetRenderWindow(renderWindow);
interactor->Initialize();
interactor->Start();
}
最终效果:
左侧是原图,右侧是二值化之后的图