vtk 曲线 样式_VTK实践_4_(图像处理2)

灰度直方图

/**********************************************************************

@我是铁牛,祝大家幸福

本代码的核心在于:

通过vtkXYPlotActor的相关方法,获取直角坐标系得相关配置

通过遍历每一个像素点

提取组分数

获取灰度范围

给每个通赋予颜色

打标签

**********************************************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//测试图像:../data/lena.bmp

int main(int argc, char* argv[])

{

//输入图像

vtkSmartPointer reader =

vtkSmartPointer::New();

reader->SetFileName ("../data/lena.bmp");

reader->Update();

int numComponents = reader->GetOutput()->GetNumberOfScalarComponents();//获得组分数,用于后续的读取

//直角坐标系

vtkSmartPointer plot = //点对象,类似于前面的vtkBarChartActor;对XY的直角坐标系的创建以及参数的设定

vtkSmartPointer::New();

plot->ExchangeAxesOff();

plot->SetLabelFormat( "%b" );

plot->SetXTitle( "renge" );

plot->SetYTitle( "count" );

plot->SetXValuesToValue();

plot->GetProperty()->SetColor(1.0, 0.0, 0.0);

plot->GetAxisLabelTextProperty()->SetColor(0.0, 0.0, 1.0);

plot->GetAxisTitleTextProperty()->SetColor(0.0, 1.0, 0.0);

//颜色

double colors[3][3] = {

{ 1, 0, 0 },

{ 0, 1, 0 },

{ 0, 0, 1 }

};

//颜色

const char* labels[3] = { "Red", "Green", "Blue" };

//极值

int xmax = 0;

int ymax = 0;

for( int i = 0; i < numComponents; ++i )//遍历每个像素点

{

vtkSmartPointer extract = //提取每个组分像素

vtkSmartPointer::New();

extract->SetInputConnection( reader->GetOutputPort() );

extract->SetComponents( i );

extract->Update();

//获取灰度范围;用来表示横坐标;extent表示中间范围

double range[2];

extract->GetOutput()->GetScalarRange( range );

int extent = static_cast(range[1])-static_cast(range[0])-1;

vtkSmartPointer histogram = //统计每个组分的直方图,也就是每一个部分有多少数目

vtkSmartPointer::New();

histogram->SetInputConnection( extract->GetOutputPort() );//链接

histogram->SetComponentExtent( 0,extent, 0, 0, 0, 0);//RGB三个通道组分的最小值最大值

histogram->SetComponentOrigin( range[0],0,0 );//统计每个灰度值的其实值

histogram->SetComponentSpacing( 1,0,0 );//每个像素都统计

histogram->SetIgnoreZero( 1 );//像素点为0的时候不做统计

histogram->Update();

//获得像素最大的范围;用来表示纵坐标

if( range[1] > xmax )

{

xmax = range[1];

}

if( histogram->GetOutput()->GetScalarRange()[1] > ymax )

{

ymax = histogram->GetOutput()->GetScalarRange()[1];

}

//设定直方图显示的属性

plot->AddDataSetInput( histogram->GetOutput() );//获取图像的像素点

plot->SetPlotColor(i,colors[i]);//对每个像素点赋予颜色!!!!!!!!!!!!!!!!!!!!!!!!!

plot->SetPlotLabel(i,labels[i]);//右上角的Label

plot->LegendOn();

}

plot->SetXRange( 0, xmax);//设定图像的X的范围

plot->SetYRange( 0, ymax);//设定图像的Y的范围

//管线

vtkSmartPointer renderer =

vtkSmartPointer::New();

renderer->AddActor(plot);

renderer->SetBackground(1.0, 1.0, 1.0);

vtkSmartPointer renderWindow =

vtkSmartPointer::New();

renderWindow->AddRenderer( renderer );

renderWindow->SetSize(640, 480);

renderWindow->Render();

renderWindow->SetWindowName("ImageAccumulateExample2");

vtkSmartPointer interactor =

vtkSmartPointer::New();

interactor->SetRenderWindow( renderWindow );

interactor->Initialize();

interactor->Start();

return EXIT_SUCCESS;

}

图像的重采样重采样的概念:就是对数字图像按照所需要的像素位置与像素间距进行重新采样。是一个图像恢复的过程。重建离散数字图像,用像素点的估计或者插值的方法进行估计。如:SIFT特征提取。可分为降采样与升采样

@

我是幸福,祝大家铁子

本代码就是对升采样和降采样,主要着重在

#include //降采样头文件

#include //升采样头文件

通过改变维度以及其像素之间的间隔用于对像素点的采样

/*

@我是幸福,祝大家铁子

本代码就是对升采样和降采样,主要着重在

#include //降采样头文件

#include //升采样头文件

通过改变维度以及其像素之间的间隔用于对像素点的采样

*/

#include

#include

#include

#include //降采样头文件

#include //升采样头文件

#include

#include

#include

#include

#include //交互样式

int main()

{

vtkSmartPointer reader =

vtkSmartPointer::New();

reader->SetFileName("..//data//lena.bmp");

reader->Update();

vtkSmartPointer shrinkFilter =

vtkSmartPointer::New();

shrinkFilter->SetInputConnection(reader->GetOutputPort());//建立管道

shrinkFilter->SetShrinkFactors(16, 16, 1);//设置降采样率

shrinkFilter->Update();

vtkSmartPointer magnifyFilter =

vtkSmartPointer::New();

magnifyFilter->SetInputConnection(reader->GetOutputPort());

magnifyFilter->SetMagnificationFactors(10, 10, 1);//升采样率

magnifyFilter->Update();

int originalDims[3];

reader->GetOutput()->GetDimensions(originalDims);

double originalSpacing[3];

reader->GetOutput()->GetSpacing(originalSpacing);

int shrinkDims[3];

shrinkFilter->GetOutput()->GetDimensions(shrinkDims);

double shrinkSpacing[3];

shrinkFilter->GetOutput()->GetSpacing(shrinkSpacing);

int magnifyDims[3];

magnifyFilter->GetOutput()->GetDimensions(magnifyDims);

double magnifuSpacing[3];

magnifyFilter->GetOutput()->GetSpacing(magnifuSpacing);

std::cout << "原始维度: " << originalDims[0] << "*" << originalDims[1] << "*" << originalDims[2] << std::endl;

std::cout << "原始像素间距: " << originalSpacing[0] << " " << originalSpacing[1] << " " << originalSpacing[2] << std::endl;

std::cout << "降采样维度: " << shrinkDims[0] << "*" << shrinkDims[1] << "*" << shrinkDims[2] << std::endl;

std::cout << "降采样像素间距:" << shrinkSpacing[0] << " " << shrinkSpacing[1] << " " << shrinkSpacing[2] << std::endl;

std::cout << "升采样维度: " << magnifyDims[0] << "*" << magnifyDims[1] << "*" << magnifyDims[2] << std::endl;

std::cout << "升采样像素间距:" << magnifuSpacing[0] << " " << magnifuSpacing[1] << " " << magnifuSpacing[2] << std::endl;

vtkSmartPointer origActor =

vtkSmartPointer::New();

origActor->SetInputData(reader->GetOutput());

vtkSmartPointer shrinkActor =

vtkSmartPointer::New();

shrinkActor->SetInputData(shrinkFilter->GetOutput());

vtkSmartPointer magnifyActor =

vtkSmartPointer::New();

magnifyActor->SetInputData(magnifyFilter->GetOutput());

//位置

double origView[4] = { 0, 0, 0.3, 1.0 };

double shrinkView[4] = { 0.3, 0, 0.6, 1.0 };

double magnifyView[4] = { 0.6, 0, 1, 1 };

vtkSmartPointer origRender =

vtkSmartPointer::New();

origRender->SetViewport(origView);

origRender->AddActor(origActor);

origRender->ResetCamera();

origRender->SetBackground(1, 0, 0);

vtkSmartPointer shrinkRender =

vtkSmartPointer::New();

shrinkRender->SetViewport(shrinkView);

shrinkRender->AddActor(shrinkActor);

shrinkRender->ResetCamera();

shrinkRender->SetBackground(0, 1, 0);

vtkSmartPointer magnifyRender =

vtkSmartPointer::New();

magnifyRender->SetViewport(magnifyView);

magnifyRender->AddActor(magnifyActor);

magnifyRender->ResetCamera();

magnifyRender->SetBackground(0, 0, 1);

vtkSmartPointer rw =

vtkSmartPointer::New();

rw->AddRenderer(origRender);

rw->AddRenderer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值