1. 程式人生 > 其它 >影象灰度處理與邊緣檢測

影象灰度處理與邊緣檢測

圖片是從網上下載,先將其處理為灰度影象,之後進行邊緣檢測。

#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