С.И.Хашин
При обработке видео, постоянно приходится передавать из функции в функцию набор из трех целочисленных матриц (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.