Skip to content
Snippets Groups Projects
Commit 26764424 authored by Julien Michel's avatar Julien Michel
Browse files

ENH: StandardImageViewer (work in progress)

parent 38b6c813
No related branches found
No related tags found
No related merge requests found
......@@ -154,7 +154,7 @@ HistogramCurve<THistogram>
}
mean/=nbSamples;
squaremean/=nbSamples;
m_Maximum[1] = mean + vcl_sqrt(squaremean - mean*mean);
m_Maximum[1] = mean + 6*vcl_sqrt(squaremean - mean*mean);
m_BinWidth = (last-first)/(nbSamples);
}
......
......@@ -74,6 +74,10 @@ public:
<ImageType,ImageType> ResampleFilterType;
typedef typename ResampleFilterType::Pointer ResampleFilterPointerType;
/** Rendering function typedef */
typedef typename ImageLayerType::DefaultRenderingFunctionType RenderingFunctionType;
typedef typename RenderingFunctionType::Pointer RenderingFunctionPointerType;
/** Get the generated layer */
itkGetObjectMacro(Layer,ImageLayerType);
......@@ -108,6 +112,9 @@ public:
itkSetMacro(ScreenRatio,double);
itkGetMacro(ScreenRatio,double);
/** Get the generated default rendering function */
itkGetObjectMacro(DefaultRenderingFunction,RenderingFunctionType);
protected:
/** Constructor */
ImageLayerGenerator();
......@@ -131,6 +138,9 @@ private:
/** The generated image layer */
ImageLayerPointerType m_Layer;
/** The default rendering function */
RenderingFunctionPointerType m_DefaultRenderingFunction;
/** The input image */
ImagePointerType m_Image;
......
......@@ -27,7 +27,7 @@ namespace otb
template < class TImageLayer >
ImageLayerGenerator<TImageLayer>
::ImageLayerGenerator() : m_Layer(), m_Image(), m_Quicklook(),
::ImageLayerGenerator() : m_Layer(), m_DefaultRenderingFunction(), m_Image(), m_Quicklook(),
m_SubsamplingRate(1), m_GenerateQuicklook(true),
m_Resampler(), m_ScreenRatio(0.25)
{
......@@ -35,6 +35,8 @@ ImageLayerGenerator<TImageLayer>
m_Layer = ImageLayerType::New();
// Resampler
m_Resampler = ResampleFilterType::New();
// Rendering function
m_DefaultRenderingFunction = RenderingFunctionType::New();
}
template < class TImageLayer >
......@@ -123,35 +125,31 @@ ImageLayerGenerator<TImageLayer>
m_Layer->SetHasScaledExtract(true);
m_Layer->VisibleOn();
// Set up rendering function
typedef typename ImageLayerType::DefaultRenderingFunctionType RenderingFunctionType;
typename RenderingFunctionType::Pointer rfunc = RenderingFunctionType::New();
// Setup channels
switch(m_Image->GetNumberOfComponentsPerPixel())
{
case 1:
{
rfunc->SetAllChannels(0);
m_DefaultRenderingFunction->SetAllChannels(0);
break;
}
case 2:
{
rfunc->SetAllChannels(0);
m_DefaultRenderingFunction->SetAllChannels(0);
}
case 3:
{
rfunc->SetRedChannelIndex(0);
rfunc->SetGreenChannelIndex(1);
rfunc->SetBlueChannelIndex(2);
m_DefaultRenderingFunction->SetRedChannelIndex(0);
m_DefaultRenderingFunction->SetGreenChannelIndex(1);
m_DefaultRenderingFunction->SetBlueChannelIndex(2);
break;
}
case 4:
{
// Handle quickbird like channel order
rfunc->SetRedChannelIndex(2);
rfunc->SetGreenChannelIndex(1);
rfunc->SetBlueChannelIndex(0);
m_DefaultRenderingFunction->SetRedChannelIndex(2);
m_DefaultRenderingFunction->SetGreenChannelIndex(1);
m_DefaultRenderingFunction->SetBlueChannelIndex(0);
break;
}
default:
......@@ -162,7 +160,7 @@ ImageLayerGenerator<TImageLayer>
}
// Set the rendering function
m_Layer->SetRenderingFunction(rfunc);
m_Layer->SetRenderingFunction(m_DefaultRenderingFunction);
}
template < class TImageLayer >
......
......@@ -34,6 +34,10 @@
#include "otbPixelDescriptionModel.h"
#include "otbPixelDescriptionActionHandler.h"
#include "otbPixelDescriptionView.h"
#include "otbStandardRenderingFunction.h"
#include "otbVectorData.h"
#include "otbVectorDataProjectionFilter.h"
#include "otbVectorDataGlComponent.h"
#include <Fl/Fl_Tile.H>
#include <Fl/Fl_Group.H>
......@@ -46,7 +50,7 @@ namespace otb
*
*/
template <class TImage>
template <class TImage, class TVectorData = VectorData<double> >
class StandardImageViewer
: public itk::Object
{
......@@ -66,6 +70,11 @@ public:
/** Input image type */
typedef TImage ImageType;
typedef typename ImageType::Pointer ImagePointerType;
typedef typename ImageType::InternalPixelType InternalPixelType;
/** VectorData typedef */
typedef TVectorData VectorDataType;
typedef typename VectorDataType::Pointer VectorDataPointerType;
/** Output image type */
typedef itk::RGBPixel<unsigned char> RGBPixelType;
......@@ -108,6 +117,11 @@ public:
typedef otb::ChangeScaleActionHandler
<RenderingModelType,ViewType> ChangeScaleHandlerType;
/** Rendering function */
typedef typename ImageLayerGeneratorType::RenderingFunctionType StandardRenderingFunctionType;
typedef typename StandardRenderingFunctionType::Pointer StandardRenderingFunctionPointerType;
/** Pixel description */
typedef PixelDescriptionModel<OutputImageType> PixelDescriptionModelType;
typedef typename PixelDescriptionModelType::Pointer PixelDescriptionModelPointerType;
......@@ -117,10 +131,27 @@ public:
< PixelDescriptionModelType > PixelDescriptionViewType;
typedef typename PixelDescriptionViewType::Pointer PixelDescriptionViewPointerType;
/** VectorData overlay */
typedef VectorDataProjectionFilter
<VectorDataType,VectorDataType> VectorDataProjectionFilterType;
typedef VectorDataGlComponent<VectorDataType> VectorDataGlComponentType;
/** Set/Get the image to render */
itkSetObjectMacro(Image,ImageType);
itkGetObjectMacro(Image,ImageType);
/** Set/Get the VectorData to render */
itkSetObjectMacro(VectorData,VectorDataType);
itkGetObjectMacro(VectorData,VectorDataType);
/** Set/Get the DEM directory */
itkSetStringMacro(DEMDirectory);
itkGetStringMacro(DEMDirectory);
/** Set/Get the Label */
itkSetStringMacro(Label);
itkGetStringMacro(Label);
/** Update and show the widget (you should call Fl::run() to hold to
* display */
void Update();
......@@ -137,9 +168,15 @@ private:
StandardImageViewer(const Self&); // purposely not implemented
void operator=(const Self&); // purposely not implemented
/** Label of the viewer */
std::string m_Label;
/** Pointer to the image */
ImagePointerType m_Image;
/** Pointer to the VectorData */
VectorDataPointerType m_VectorData;
/** The image layer */
ImageLayerPointerType m_ImageLayer;
......@@ -161,6 +198,12 @@ private:
/** The widget controller */
WidgetControllerPointerType m_Controller;
/** StandardRenderingFunction */
StandardRenderingFunctionPointerType m_RenderingFunction;
/** Path to the DEMDirectory (used if a VectorData is rendered */
std::string m_DEMDirectory;
/** The window */
Fl_Window * m_Window;
......
......@@ -23,9 +23,10 @@
namespace otb
{
template <class TImage>
StandardImageViewer<TImage>
::StandardImageViewer() : m_Image(), m_ImageLayer(), m_RenderingModel(),m_PixelDescriptionModel(), m_View(), m_PixelDescriptionView(), m_CurveWidget(), m_Controller(), m_Window(),
template <class TImage,class TVectorData>
StandardImageViewer<TImage,TVectorData>
::StandardImageViewer() : m_Label("Default label"), m_Image(), m_VectorData(), m_ImageLayer(), m_RenderingModel(),m_PixelDescriptionModel(),
m_View(), m_PixelDescriptionView(), m_CurveWidget(), m_Controller(), m_RenderingFunction(), m_Window(),
m_FullGroup(),m_SideGroup(),m_Tile(),m_Width(800),m_Height(600), m_SideBarWidth(200)
{
// Build a new rendering model
......@@ -48,7 +49,7 @@ StandardImageViewer<TImage>
m_View->SetController(m_Controller);
m_PixelDescriptionView->SetModel(m_PixelDescriptionModel);
// Add the resizing handler
// Add the resizing handler
ResizingHandlerType::Pointer resizingHandler = ResizingHandlerType::New();
resizingHandler->SetModel(m_RenderingModel);
resizingHandler->SetView(m_View);
......@@ -100,8 +101,8 @@ StandardImageViewer<TImage>
m_PixelDescriptionView->GetPixelDescriptionWidget()->resize(m_Width-m_SideBarWidth,3*m_Height/4,m_SideBarWidth,m_Height/4);
}
template <class TImage>
StandardImageViewer<TImage>
template <class TImage,class TVectorData>
StandardImageViewer<TImage,TVectorData>
::~StandardImageViewer()
{
m_Tile->remove(m_View->GetScrollWidget());
......@@ -112,38 +113,67 @@ StandardImageViewer<TImage>
delete m_Window;
}
template <class TImage>
template <class TImage,class TVectorData>
void
StandardImageViewer<TImage>
StandardImageViewer<TImage,TVectorData>
::Update()
{
// First check if there is actually an input image
if(m_Image.IsNull())
{
itkExceptionMacro(<<"The image pointer is null, there is nothing to display. You probably forget to set the image.");
}
// TODO: Add a real label here
m_Window->label("The label");
// Update image info for further use
m_Image->UpdateOutputInformation();
// If there is a VectorData
if(m_VectorData.IsNotNull())
{
// Reproject VectorData in image projection
typename VectorDataProjectionFilterType::Pointer vproj = VectorDataProjectionFilterType::New();
vproj->SetInput(m_VectorData);
vproj->SetOutputKeywordList(m_Image->GetImageKeywordlist());
vproj->SetOutputOrigin(m_Image->GetOrigin());
vproj->SetOutputSpacing(m_Image->GetSpacing());
vproj->SetDEMDirectory(m_DEMDirectory);
vproj->Update();
// Create a VectorData gl component
typename VectorDataGlComponentType::Pointer vgl = VectorDataGlComponentType::New();
vgl->SetVectorData(vproj->GetOutput());
// Add it to the image view
m_View->GetScrollWidget()->AddGlComponent(vgl);
m_View->GetFullWidget()->AddGlComponent(vgl);
m_View->GetZoomWidget()->AddGlComponent(vgl);
}
// Generate the layer
ImageLayerGeneratorPointerType generator = ImageLayerGeneratorType::New();
generator->SetImage(m_Image);
generator->GenerateLayer();
m_ImageLayer = generator->GetLayer();
m_RenderingFunction = generator->GetDefaultRenderingFunction();
// Set the window and layer label
m_Window->label(m_Label.c_str());
m_ImageLayer->SetName(m_Label);
// Add the generated layer to the rendering model
m_RenderingModel->AddLayer(generator->GetLayer());
// Show everything
m_Window->show();
m_View->GetScrollWidget()->show();
m_View->GetFullWidget()->show();
m_View->GetZoomWidget()->show();
m_CurveWidget->show();
// Update the rendering model
m_RenderingModel->Update();
// adding histograms
// adding histograms rendering
typename HistogramCurveType::ColorType red,green,blue, gray;
red.Fill(0);
red[0]=1.;
......@@ -160,17 +190,17 @@ StandardImageViewer<TImage>
gray.Fill(0.5);
typename HistogramCurveType::Pointer rhistogram = HistogramCurveType::New();
rhistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(0));
rhistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(m_RenderingFunction->GetRedChannelIndex()));
rhistogram->SetHistogramColor(red);
rhistogram->SetLabelColor(red);
typename HistogramCurveType::Pointer ghistogram = HistogramCurveType::New();
ghistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(1));
ghistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(m_RenderingFunction->GetGreenChannelIndex()));
ghistogram->SetHistogramColor(green);
ghistogram->SetLabelColor(green);
typename HistogramCurveType::Pointer bhistogram = HistogramCurveType::New();
bhistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(2));
bhistogram->SetHistogram(m_ImageLayer->GetHistogramList()->GetNthElement(m_RenderingFunction->GetBlueChannelIndex()));
bhistogram->SetHistogramColor(blue);
bhistogram->SetLabelColor(blue);
m_CurveWidget->AddCurve(rhistogram);
......@@ -178,8 +208,6 @@ StandardImageViewer<TImage>
m_CurveWidget->AddCurve(bhistogram);
m_CurveWidget->SetXAxisLabel("Pixels");
m_CurveWidget->SetYAxisLabel("Amount");
}
}
#endif
......@@ -18,6 +18,9 @@ PURPOSE. See the above copyright notices for more information.
#include "otbStandardImageViewer.h"
#include "otbVectorImage.h"
#include "otbImageFileReader.h"
#include "otbVectorData.h"
#include "otbVectorDataFileReader.h"
int otbStandardImageViewer( int argc, char * argv[] )
{
......@@ -26,13 +29,32 @@ int otbStandardImageViewer( int argc, char * argv[] )
typedef otb::VectorImage<double,2> ImageType;
typedef otb::ImageFileReader<ImageType> ReaderType;
typedef otb::StandardImageViewer<ImageType> ViewerType;
typedef otb::VectorData<double> VectorDataType;
typedef otb::VectorDataFileReader<VectorDataType> VectorDataFileReaderType;
VectorDataFileReaderType::Pointer vreader = VectorDataFileReaderType::New();
ReaderType::Pointer reader = ReaderType::New();
ViewerType::Pointer viewer = ViewerType::New();
VectorDataFileReaderType::Pointer vdreader = VectorDataFileReaderType::New();
reader->SetFileName(argv[1]);
viewer->SetImage(reader->GetOutput());
if(argc>3)
{
std::cout<<"Adding a vector layer from file "<<argv[3]<<std::endl;
vdreader->SetFileName(argv[3]);
viewer->SetVectorData(vdreader->GetOutput());
}
if(argc>4)
{
std::cout<<"Reprojecting using DEM "<<argv[4]<<std::endl;
viewer->SetDEMDirectory(argv[4]);
}
viewer->SetLabel("Testing standard viewer");
viewer->Update();
if(run)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment