影象灰度處理與邊緣檢測
阿新 • • 發佈:2022-03-22
圖片是從網上下載,先將其處理為灰度影象,之後進行邊緣檢測。
#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