#ifndef __LSRM_BAATZ_SEGMENTER_H
#define __LSRM_BAATZ_SEGMENTER_H
#include "lsrmSegmenter.h"
/*
* Tutorial : Implementation of the Baatz & Schape criterion
*
* Details about the criterion can be found in the following publication:
*
* Martin Baatz and Arno Schape. Multiresolution segmentation: an optimization approach for high quality multi-scale image segmentation.
* Angewandte Geographische Informationsverarbeitung XII, pages 12–23, 2000.
*
* The steps are ordered has to be followed in a chronological way for a full understanding.
* This tutorial does not aim at explaining all the details of the large scale region merging
* but gives all the elements to use it properly.
*/
namespace lsrm
{
/*
* Step 1 :
* We define the specific attributes required for the Baatz & Schape criterion.
* Regions are represented by nodes in a graph and the lsrm library has an internal
* representation of the nodes with the class lsrm::Node.
* --> A node contains a unique number to be indentified, it corresponds to the vectorized
* coordinates of its first pixel and its name is m_Id.
* To retrieve the 2D coordinates from the value of m_Id, it is necessary to know the dimension
* of the image (the number of rows and columns), then :
* x = m_Id % columns and y = m_Id / columns.
*
* --> A node contains the perimeter (m_Perimeter) of its corresponding region, it is the length of the external
* boundary of the region. For example a region of one pixel has a perimeter of 4.
*
* --> A node contains the area (m_Area) of its corresponding region, it is the number of pixels within the
* region.
*
* --> A node contains the minimum rectangular bounding box (parrallel to the image axis) of the region (m_Bbox).
* the boundix box is determined by the structure lsrm::BoundingBox with the coordinates of the upper left
* corner pixel and the width and the height (m_UX, m_UY, m_W, m_H).
*
* After Reading the paper about the Baatz & Schape criterion, we can conclude that we have to define additional
* spectral attributes for a node: its mean vector, the square mean vector, the sum of all the pixels
* and the standard deviation vector.
*
* We define a new class BaatzNode which inherits from the template structure Node. Notice that the template
* is the derived node type, then the template type is BaatzNode.
*/
struct BaatzNode : Node
{
std::vector m_Means;
std::vector m_SquareMeans;
std::vector m_SpectralSum;
std::vector m_Std;
};
/*
* Step 2
*
* The Baatz & Schape criterion has user-defined parameters, the spectral weight
* which is the relative importance given to the spectral components and the shape
* weight for the shape components.
*
* We define then a structure wrapping these two parameters we called BaatzParam.
*/
struct BaatzParam
{
float m_SpectralWeight;
float m_ShapeWeight;
};
/*
* Step 3 :
*
*/
template
class BaatzSegmenter : public Segmenter< TImage, BaatzNode, BaatzParam>
{
public:
/* Some convenient typedefs */
typedef Segmenter Superclass;
typedef TImage ImageType;
typedef BaatzParam ParameterType;
typedef typename Superclass::GraphType GraphType;
typedef BaatzNode NodeType;
typedef typename Superclass::EdgeType EdgeType;
typedef typename Superclass::NodePointerType NodePointerType;
typedef typename Superclass::GraphOperatorType GraphOperatorType;
typedef GraphToOtbImage IOType;
BaatzSegmenter();
void Update();
float ComputeMergingCost(NodePointerType n1, NodePointerType n2);
void UpdateSpecificAttributes(NodePointerType n1, NodePointerType n2);
void InitFromImage();
long long unsigned int GetNodeMemory(NodePointerType &node);
};
} // end of namespace lsrm
#include "lsrmBaatzSegmenter.txx"
#endif