VTK修炼之道33:边缘检测_Sobel算子
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道33:边缘检测_Sobel算子
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.Sobel算子用于提取圖像邊緣
Sobel算子也是一種常用的梯度算子。Sobel算子計算稍微復(fù)雜,它采用3x3的模板。計算時模板在圖像上移動,并在每個位置上計算對應(yīng)中心像素的梯度值。VTK中vtkSobel2D計算圖像的sobel算子,使用代碼如下: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h> #include <vtkJPEGReader.h> #include <vtkImageSobel2D.h> #include <vtkImageExtractComponents.h> #include <vtkImageMathematics.h> #include <vtkImageData.h> #include <vtkImageShiftScale.h> #include <vtkImageActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h>int main() {vtkSmartPointer<vtkJPEGReader> reader =vtkSmartPointer<vtkJPEGReader>::New();reader->SetFileName("lena.jpg");reader->Update();vtkSmartPointer<vtkImageSobel2D> sobelFilter =vtkSmartPointer<vtkImageSobel2D>::New();sobelFilter->SetInputConnection(reader->GetOutputPort());//包含橫向和豎向邊緣//提取X向邊緣成分vtkSmartPointer<vtkImageExtractComponents> xSobel =vtkSmartPointer<vtkImageExtractComponents>::New();xSobel->SetComponents(0);//提取第一成分即X向梯度xSobel->SetInputConnection(sobelFilter->GetOutputPort());xSobel->Update();vtkSmartPointer<vtkImageMathematics> absFilter =vtkSmartPointer<vtkImageMathematics>::New();absFilter->SetOperationToAbsoluteValue();//將屬性設(shè)置為絕對值模式absFilter->SetInputConnection(xSobel->GetOutputPort());absFilter->Update();double xRange[2];absFilter->GetOutput()->GetScalarRange(xRange);vtkSmartPointer<vtkImageShiftScale> xShiftScale =vtkSmartPointer<vtkImageShiftScale>::New();xShiftScale->SetOutputScalarTypeToUnsignedChar();//強(qiáng)制類型轉(zhuǎn)換 方便顯示xShiftScale->SetScale(255 / xRange[1]);//設(shè)置屬性xShiftScale->SetInputConnection(absFilter->GetOutputPort());xShiftScale->Update();//提取Y向邊緣成分vtkSmartPointer<vtkImageExtractComponents> ySobel =vtkSmartPointer<vtkImageExtractComponents>::New();ySobel->SetComponents(1);ySobel->SetInputConnection(sobelFilter->GetOutputPort());ySobel->Update();vtkSmartPointer<vtkImageMathematics> absYsobel =vtkSmartPointer<vtkImageMathematics>::New();absYsobel->SetOperationToAbsoluteValue();absYsobel->SetInputConnection(ySobel->GetOutputPort());absYsobel->Update();double yRange[2];absYsobel->GetOutput()->GetScalarRange(yRange);vtkSmartPointer<vtkImageShiftScale> yShiftScale =vtkSmartPointer<vtkImageShiftScale>::New();yShiftScale->SetOutputScalarTypeToUnsignedChar();yShiftScale->SetScale(255 / yRange[1]);yShiftScale->SetInputConnection(absYsobel->GetOutputPort());yShiftScale->Update();vtkSmartPointer<vtkImageActor> origActor =vtkSmartPointer<vtkImageActor>::New();origActor->SetInputData(reader->GetOutput());vtkSmartPointer<vtkImageActor> xSobelActor =vtkSmartPointer<vtkImageActor>::New();xSobelActor->SetInputData(xShiftScale->GetOutput());vtkSmartPointer<vtkImageActor> ySobelActor =vtkSmartPointer<vtkImageActor>::New();ySobelActor->SetInputData(yShiftScale->GetOutput());/double origView[4] = { 0, 0, 0.33, 1 };double xSobelView[4] = { 0.33, 0, 0.66, 1 };double ySobelView[4] = { 0.66, 0, 1, 1 };vtkSmartPointer<vtkRenderer> origRender =vtkSmartPointer<vtkRenderer>::New();origRender->SetViewport(origView);origRender->AddActor(origActor);origRender->ResetCamera();origRender->SetBackground(1, 0, 0);vtkSmartPointer<vtkRenderer> xSobelRender =vtkSmartPointer<vtkRenderer>::New();xSobelRender->SetViewport(xSobelView);xSobelRender->AddActor(xSobelActor);xSobelRender->ResetCamera();xSobelRender->SetBackground(0, 1, 0);vtkSmartPointer<vtkRenderer> ySobelRender =vtkSmartPointer<vtkRenderer>::New();ySobelRender->SetViewport(ySobelView);ySobelRender->AddActor(ySobelActor);ySobelRender->ResetCamera();ySobelRender->SetBackground(0, 0, 1);//vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(origRender);rw->AddRenderer(xSobelRender);rw->AddRenderer(ySobelRender);rw->SetSize(960, 320);rw->SetWindowName("Edge by Soebl");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style =vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(rw);rwi->Initialize();rwi->Start();return 0; }
該例中計算利用Sobel算子計算圖像的梯度圖像,然后提取X方向的梯度分量和Y方向的梯度分量。 由于計算Sobel算子的值可能存在負(fù)值,因此利用vtkImageMathematics對各個分量圖像計算絕對值,再由vtkImageShiftScale將圖像的數(shù)值范圍調(diào)節(jié)到0-255之間再顯示。 執(zhí)行結(jié)果如下:
2.參看資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
4. ?張曉東, 羅火靈. VTK圖形圖像開發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.
總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道33:边缘检测_Sobel算子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Facebook与MySpace实现即时
- 下一篇: VTK修炼之道35:边缘检测_Lapla