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