灰度直方图
/**********************************************************************
@我是铁牛,祝大家幸福
本代码的核心在于:
通过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