图像灰度处理与边缘检测

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

#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 @ 2022-03-22 13:55  二先生-  阅读(268)  评论(0)    收藏  举报