Last modified 10 years ago Last modified on 02/13/08 11:43:23

Using the containers of MIST

Introduction

An image can be of "binary", "grey scale", "colored", or other type. For MIST, there exist several image processing filters such as "smoothing", "finite difference", and so on. MIST is templated, so a wide variety of data types can be used with the images and the filters.

Thanks to templating, no matter whether you work on "binary images", "grey scale images", or "color images", you can use the same calling convention for the methods. Only internally you have different types. Therefore, you can work on "containers" and just put the content of your varying images (binary, grey scale, color) into these containers. Templating and overloading available with C++ allows you to run the provided algorithms and filters on this container, independent from the data type it contains.

You can think of images, sound, etc. as signals of 1, 2, or 3 dimensions. MIST uses matrices to store and process these signals.

The basic elements of MIST

Main MIST containers (to handle images and audio):

  • array: 1 dimensional array, aligned continuously in the memory, which conforms to STL, basic class for all audio and video data
  • array1: 1 dimensional array to deal with sound
  • array2: 2 dimensional image class
  • array3: 3 dimensional image class
  • matrix: general purpose matrix class(allows Expression templates for high-speed operations)
  • vector: N dimensional vector class

Additional auxiliary classes:

  • marray: Class dealing with the margins of 1, 2, or 3 dimensional images
  • buffered_array: 画像の一辺が2の指数乗となる画像を扱うクラス
  • set: 要素の集合を扱うクラス

The container elements are of following type:

  • rgb
  • binary
  • stereo: for stereo sound
  • quaternion
  • integer
  • decimal
  • vector2
  • vector3

First steps

In order to use MIST, be sure to include the mist/mist.h header file.

#include <mist/mist.h>

As MIST uses C++, please also include iostream.

#include <iostream>
#include <mist/mist.h>

Choose your data type

Next, you should decide, which data type your image or sound has. You can use the types available with STL. For example, for a grey-scale image you can use unsigned char, for a color image you can use mist::rgb< unsigned char >.

Declaring an image

For a 2 dimensional image, you can use a mist::array2:

mist::array2< unsigned char > image( 500, 500 );

Each pixel of your 2D image will be of type unsigned char. For a color image, you can use

mist::array2< mist::rgb< unsigned char > > image( 500, 500 );

This example will create an image of 500x500 pixels at initialization. Replacing unsigned char by e.g. double would not be a problem. In addition, you can use STL's allocator concept.

At initialization, each element of your picture will be set to 0 in the default constructor.

Accessing elements

画像を確保しただけでは何にもうれしくありません. それぞれの要素にアクセスできて,はじめて意味があるわけです. MISTでは,各要素へのアクセスは括弧演算子というものを利用します. 具体的には次のような画像を確保したとします.

mist::array2< mist::rgb< unsigned char > > image( 500, 500 );

この image(100, 50) の要素に 1 を代入するならこう書けばOKです.

image( 100, 50 ) = 1;

要素の値をとってくる場合でも同じように書けばOKです. ただし,ここで指定した (100, 50) の要素が存在することが条件です. つまり,100×100で確保した画像の (200, 50) の要素を取得・設定することはできないということです. 非常に簡単ですが,これだけできれば音声・画像を自由にアクセスすることができるようになります.

また,C/C++言語の配列と同じように,MISTの画像も要素の開始インデックスは 0 から始まります. 要するに幅100の画像を確保した場合のインデックスの範囲は 099 になるので注意してください!!

Initializing element values

画像の各要素を何らかの値で初期化したいことがよくあります. そんなときは, fill 関数を利用します. MISTではSTLと同じ処理内容の関数があれば,同じ名前を採用するようにしています. なので,STLに存在している fill 関数と同じ名前となっています. 使い方はいたって簡単で,コンテナ内の全要素を初期値(通常はデフォルトコンストラクタ,算術型では 0 )で初期化する場合には,

image.fill( );

と書けばOKですし,値を指定して要素を初期化したい場合は,

image.fill( 255 );

と書きます.

Freeing memory

もう使用しなくなった画像が利用しているメモリを,明示的に開放したい場合は次のように書きます.

image.clear( );

こう書くことで,要素数0の画像となります. また,MISTの画像コンテナは,画像オブジェクトのスコープが外れた時点(デストラクタの呼び出し時)で自動的にメモリを開放してくれるので,通常は clear 関数を呼び出す必要はありません.

Resizing the image

ある画像のサイズを変更したい場合は,リサイズ関数を利用します.

image.resize( 100, 200 );

こう書くことで,100×200の画像に変更されます. ただし,リサイズ関数を呼び出しても,画像内の各要素が初期化されるとは限りません. MISTでは,必要なメモリ量が変わったときにのみ全要素を初期化します. そのため,必ずリサイズ後に全要素を初期化したい場合は,前述の fill 関数を利用してください.