К оглавлению

Набор из трех матриц

С.И.Хашин


iMatrix3.h - заголовочный файл
iMatrix3.cpp - реализация.

При обработке видео, постоянно приходится передавать из функции в функцию набор из трех целочисленных матриц (matr). Для сокращения размера кода, введем простой класс matr3, содержащий три матрицы (r,g,b) одинакового размера.

Основные методы:

    void    put( int x, int y, int vr, int vg, int vb );
    int     get( int x, int y );                            // r + 256*g + 256^2*b
    void    inc( int x, int y, int vr, int vg, int vb );    // увеличить один элемент на vr,vg,vb
    void    set( int vr, int vg, int vb );                  // заполнить всю матрицу одним значением

    void    normalize( int k );                 // привести значения каждой компоненты к отрезку [0..k]
    void    Mod( int k );                       // привести значения каждой компоненты mod k (0..k-1)

    // algebra
    void    add ( matr3 &a);                    // this += a
    void    add ( matr3 &a, int k);             // this += a*k
    void    mult( int k);                       // this *= k
    void    div ( int k);                       // this /= k
    void    addV( int ar, int ag, int ab);      // this.r[*,*] += ar, this.g[*,*] += ag, this.b[*,*] += ab

    ldouble mGrad( int x, int y);               // морф.градиент в точке: макс. расст. от цвета точки до цвета соседей
    ldouble dist(int x1, int y1, int x2, int y2);// расстояние между цветами точек

    // in/out
    void    saveText( const char *fname, const char *msg="", char *format = " (%4d,%4d=>%6d %6d %6d)" );
    void    copyBlock( matr3 &a, int xSrc, int ySrc, int xDst, int yDst, int dx, int dy );// this:=a[часть]

    void    smooth( int rad, int kind=1 );      // сглаживание с радиусом rad
    void    decrease( matr3 &a, int k );        // this := уменьшить размер в k раз(a)
    void    resize( matr3 &a, int mx1, int my1);// this := resize(a) до (mx,my)
    void    diffX( matr3 &a );                  // this := 2*da/dx 
    void    diffY( matr3 &a );                  // this := 2*da/dy 
    ldouble  MSE( matr3 &a );                   // Mean Square Error (Среднеквадратичное отклонение) (this,a)

    void    toRGB  ( matr &rgb );               // собрать все в одну матрицу rgb
    void    fromRGB( matr &rgb );               // извлечь все из одной матрицы rgb

    // bmp
    int     loadBMP    ( const char *fname );   
    int     saveBMP    ( const char *fname );
    void    drawEdge( int x0, int y0, int x1, int y1 ); // прорисовать отрезок [(x0,y0),(x1,y1)] дополнительным цветом
    void    drawEdge( int x0, int y0, int x1, int y1, int cr, int cg, int cb ); // прорисовать отрезок [(x0,y0),(x1,y1)] цветом (cr,cb,cb)

    void GrLen3( matr  &grl );                  // grl := длина градиента в точке(a)
    void GrLen ( matr3 &grl );                  // grl := длина градиента в точке(a)
    void GrLenM( matr  &grl );                  // grl := длина морфологического градиента в точке(a)

	double  midVar();							// средняя разность между соседями

Большая часть методов сводится к вызову соответствующих методов каждой из компонент.

Примеры:

    matr3 a;                    // описываем матрицу
    a.loadBMP(“lena.bmp”);      // загружаем картинку в цветном виде
    int mx = a.Mx(), my=a.My(); // найдем размеры матрицы, x=0..mx-1, y=0..my-1
    int r = a.r(7,8);           // яркость красного при x=7, y=8
    int g = a.g(7,8);           // яркость зеленого при x=7, y=8
    int b = a.b(7,8);           // яркость синего   при x=7, y=8
    a.r(3,9)=255;               // яркость красного при x=3, y=9 сделать равной 255
    a.g(3,9)=255;               // яркость зеленого при x=3, y=9 сделать равной 255
    a.b(3,9)=255;               // яркость синего   при x=3, y=9 сделать равной 255
    a.put(3,4, 77,88,99);       // установить цвет точки (3,4) в (77,88,99).
    a.saveBMP(“tt.bmp”);        // сохранить матрицу в виде bmp-файла

Отметим лишь, что при записи матрицы в bmp-файл (saveBMP), у каждой из трех цветовых компонент отрицательные значения заменяются на 0, а значения большие 255 — на 255.


К оглавлению


free counters