-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUBitmap.h
More file actions
341 lines (271 loc) · 12 KB
/
UBitmap.h
File metadata and controls
341 lines (271 loc) · 12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
/* ************************************************************************** */
// Copyright Alexander Bakhshiev, 2005-2008.
// E-mail: alexab@ailabe.ru
/* ************************************************************************** */
#ifndef UBITMAP_H
#define UBITMAP_H
namespace Utilities {
typedef enum {ubmColor=1, ubmGray=2, ubmMath=3} UBMColorModel;
typedef enum {ubmUp=1, ubmDown=2, ubmLeft=3, ubmRight=4} UBMShiftDirection;
typedef enum {ubmConst=1, ubmLinear=2, ubmNolinear=3} UBMResizeMethod;
typedef enum {ubmNative=1, ubmSobel=2} UBMLoopingMethod;
union UColorT
{
unsigned int c; // Целое, ч/б для вычислений формата 000C
struct { unsigned char b,g,r,d; }; // 32,24 бит RGB
UColorT(void)
{ };
UColorT(unsigned color)
{ c=color; };
UColorT(unsigned char rr, unsigned char gg, unsigned char bb, unsigned char dd=0)
{ r=rr; b=bb; g=gg; d=dd; };
UColorT operator = (const UColorT &color)
{ c=color.c; return *this; };
UColorT operator = (const unsigned color)
{ c=color; return *this; };
bool operator == (const UColorT color)
{ return (c==color.c)?true:false; };
bool operator != (const UColorT color)
{ return (c!=color.c)?true:false; };
};
// Класс, описывающий изображение
class UBitmap
{
protected: // Данные
UColorT *Data;
int Width, Height; // размеры изображения по осям
int Length; // Число элементов изображения
UBMColorModel ColorModel; // Глубина цвета
// Флаг автоматического преобразования информации из источника
// в цветовую модель приемника
// По умолчанию true
// Состояние по умолчанию расходует дополнительное время
// на преобразование
bool AutoCModelConvert;
public: // Методы
// --------------------------
// Конструкторы и деструкторы
// --------------------------
UBitmap(void);
UBitmap(const UBitmap &bitmap);
UBitmap(UBMColorModel cmodel);
UBitmap(int width, int height, UColorT color=0, UBMColorModel cmodel=ubmColor);
UBitmap(int width, int height, const unsigned* data, UBMColorModel cmodel=ubmColor);
~UBitmap(void);
// --------------------------
// -------------------------
// Методы управления данными
// -------------------------
// Возвращает указатель на внутренний буфер
inline UColorT* GetData(void) const
{ return Data; };
// Возвращает размер изображения по оси X
inline int GetWidth(void) const
{ return Width; };
// Возвращает размер изображения по оси Y
inline int GetHeight(void) const
{ return Height; };
inline int GetLength(void) const
{ return Length; };
inline UBMColorModel GetColorModel(void) const
{ return ColorModel; };
inline bool GetAutoCModelConvert(void) const
{ return AutoCModelConvert; };
// Задает глубину цвета изображения
// Если isupdate == true то существующее изображение преобразуется
void SetColorModel(UBMColorModel cmodel, bool isupdate=true);
// Задает режим преобразования цветовой модели
// приемника результатов обработки 'target' во всех методах
// если true - то target сохраняет свою цветовую модель
// если false - target принимает цветовую модель источника
void SetAutoCModelConvert(bool acmodel);
// Создает внутренний буфер
void SetRes(int width, int height);
// Копирует новое изображение из буфера data
// с прежними размерами
void SetImage(const UColorT* data);
// Копирует новое изображение из буфера data
// с новыми размерами
void SetImage(int width, int height, const UColorT* data);
// Устанавливает внутренний указатель на буфер data
// сохраняя прежнюю информацию о размерах
void SetPImage(UColorT* data);
// Устанавливает внутренний указатель на буфер data
// обновляя информацию о размерах
void SetPImage(int width, int height, UColorT* data);
// Заполняет изображение цветом color
void Fill(UColorT color);
// Копирует изображение в 'target' в позицию,
// начинающуюся как x,y
// Если изображение не вмещается целиком, то оно усекается
// Изображение всегда преобразуется в цветовую модель цели 'target'
void CopyTo(int x, int y, UBitmap &target);
// Копирует изображение в 'target' в позицию,
// начинающуюся как x,y
// Если изображение не вмещается целиком, то оно усекается
// Изображение всегда преобразуется в цветовую модель цели 'target'
// Элементы изображения источника с цветом 'transp' не переносятся
// (эффект прозрачности)
void CopyTo(int x, int y, UBitmap &target, UColorT transp);
// Возвращает участок изображения с координатами
// левого верхнего угла x,y и шириной и длиной
// соответствующей размерам 'target'
bool GetRect(int x, int y, UBitmap &target);
// Разделяет текущее изображение на RGB цветовые каналы
// Каналы формируются в соответствии с цветовой моделью 'cmodel'
// Цветовая модель изображения предполагается ubmColor
void Separate(UBitmap &red, UBitmap &green, UBitmap &blue, UBMColorModel cmodel=ubmMath);
// -------------------------
// -------------------------
// Методы сбора статистики
// -------------------------
// Возвращает минимальное и максимальное значение яркостей
void FindColorRange(UColorT &minval, UColorT &maxval);
// Вычисляет средневзвешенную сумму яркостей всех пикслей участка изображения
// Если 'width' или 'height' < 0 или превышает максимум
// то размеры участка вычисляются до конца изображения
UColorT FindAverageColor(int x=0, int y=0, int width=-1,int height=-1);
// Вычисляет суммарную яркость по строке изображения с номером y
unsigned int CalcBrightnessByRow(int y);
// Вычисляет суммарную яркость по столбцу изображения с номером x
unsigned int CalcBrightnessByCol(int x);
// Вычисляет суммарную яркость раздельно по столбцам и строками изображения от
// столбца x1 до x2, и от строки y1 до y2.
// В x_result значения столбцов, в y_result - строк, память должна быть выделена
void UBitmap::Histogram(unsigned *x_result, unsigned *y_result,
int x1=-1, int x2=-1, int y1=-1, int y2=-1);
// Вычисляет относительную суммарную интенсивность раздельно по столбцам и
// строками изображения от столбца x1 до x2, и от строки y1 до y2.
// Интенсивность считается раздельно по каналам в зависимости от цветовой модели
// В x_result значения столбцов, в y_result - строк, память должна быть выделена
void UBitmap::Histogram(UColorT *x_result, UColorT *y_result,
int x1=-1, int x2=-1, int y1=-1, int y2=-1);
// -------------------------
// -------------------------
// Методы обработки изображения
// -------------------------
// Отражение по вертикали
// Если 'target' != 0 то результат операции сохраняется в него
// и цветовая модель 'target' замещается моделью источника
void UBitmap::ReflectionX(UBitmap *target=0);
// Сдвигает изображение в требуемую сторону на 'pixels' пикселей
// Направление определяется 'direction'
// 1 - Up
// 2 - Down
// 3 - Left
// 4 - Right
// При иных значениях 'direction' или отрицательных значениях pixels
// метод не делает ничего
// Пустое место заполняется цветом 'color'
// Если 'target' != 0 то результат операции сохраняется в него
// и цветовая модель 'target' замещается моделью источника
void Move(int pixels, int direction, UColorT color=0, UBitmap *target=0);
// Сдвигает изображение на 'x' пикселей по оси абсцисс и на 'y'
// пикселей по оси ординат
// положительные значения вызывают сдвиг вправо и вниз
// отрицательные - влево и вверх
// Пустое место заполняется цветом 'color'
// Если 'target' != 0 то результат операции сохраняется в него
// и цветовая модель 'target' замещается моделью источника
void MoveXY(int x, int y, UColorT color=0, UBitmap *target=0);
// Изменяет размер канвы, сохраняя нетронутым изображение
// Если изображение не помещается целиком в новую канву,
// то оно усекается
// Свободное место заполняется цветом 'color'
// Если 'target' != 0 то результат операции сохраняется в него
// и цветовая модель 'target' замещается моделью источника
void ResizeCanvas(int top, int left, int right, int bottom, UColorT color=0, UBitmap *target=0);
// Изменяет размер изображения с линейной интерполяцией
// Если 'target' != 0 то результат операции сохраняется в него
void Resize(int width, int height, UBMResizeMethod resizemethod=ubmNolinear, UBitmap *target=0);
// Вставляет горизонтальную полосу толщиной 'thickness'
// начиная с позиции с верхней y-координатой
// Полоса заполняется цветом 'color'
void InsertHorLine(int y, int thickness, UColorT color=0, UBitmap *target=0);
// Удаляет горизонтальную полосу толщиной 'thickness'
// начиная с позиции с верхней y-координатой
void RemoveHorLine(int y, int thickness, UBitmap *target=0);
// Вставляет вертикальную полосу толщиной 'thickness'
// начиная с позиции с левой x-координатой
// Полоса заполняется цветом 'color'
void InsertVertLine(int x, int thickness, UColorT color=0, UBitmap *target=0);
// Удаляет вертикальную полосу толщиной 'thickness'
// начиная с позиции с левой x-координатой
void RemoveVertLine(int x, int thickness, UBitmap *target=0);
// Контрастирование. Производит пересчёт значений яркости в масштаб 0 - 255.
// Запись результата производится в target
void Contrasting(UBitmap *target=0);
// Контрастирование. Производит пересчёт значений яркости в масштаб minb - maxb.
// Если 'target' != 0 то результат операции сохраняется в него
void Contrasting(UColorT minb, UColorT maxb, UBitmap *target=0);
// Выделение контуров.
// Запись результата производится в target
void Looping(UBitmap *target, UBMLoopingMethod method=ubmSobel);
// Производит бинаризацию изображения с порогом threshold
// Если 'target' != 0 то результат операции сохраняется в него
// Пиксели с яркостями ниже порога устанавливаются равными 'minval'
// Пиксели с яркостями выше порога устанавливаются равными 'maxval'
void Binarization(UColorT threshold, UColorT minval, UColorT maxval, UBitmap *target=0);
// Производит автоматическую бинаризацию изображения по
// порогу, представляющему собой средневзвешенную яркость изображения
// Если 'target' != 0 то результат операции сохраняется в него
// Пиксели с яркостями ниже порога устанавливаются равными 'minval'
// Пиксели с яркостями выше порога устанавливаются равными 'maxval'
void Binarization(UColorT minval, UColorT maxval, UBitmap *target=0);
// Осуществляет фильтрацию изображение методом усреднения
// по маске размером 'masksize'
// Если размер маски задан четным, то он округляется
// до ближайшего большего нечетного
// Фильтрованное изображение сохраняется в target
// Если 'target' == 0 то не делает ничего
void MaskFiltering(int mask, UBitmap *target) const;
// Инвертирует изображение
// Если 'target' != 0 то результат операции сохраняется в него
// Для всех цветовых моделей база устанавливается == 255
// т.о. модель ubmMath необходим нормировать в [0:255] перед инверсией
void Inverse(UBitmap *target=0);
// Осуществляет построение разностного кадра
// Если 'target' != 0 то результат операции сохраняется в него
bool DifferenceFrame(const UBitmap *deduction, UBitmap *target=0);
// -------------------------
// -----------------------
// Перегруженные операторы
// -----------------------
// Оператор присваивания
// Цветовая модель приемника всегда замещается моделью источника
UBitmap& operator = (const UBitmap &bitmap);
inline unsigned& operator [] (int index) const
{ return (Data+index)->c; };
inline UColorT& operator () (int index) const
{ return *(Data+index); };
inline UColorT& operator () (int ix, int iy) const
{ return *(Data+iy*Width+ix); };
// -----------------------
protected: // Скрытые методы
// -----------------------
// Методы изменения размера изображения
// -----------------------
// Изменение размера изображения с константной интерполяцией
bool ResizeConst(UColorT *output, UColorT* input,
int oWidth, int oHeight,
int nWidth, int nHeight);
// Изменение размера изображения с линейной интерполяцией
bool ResizeLinear(UColorT *output, UColorT* input,
int oWidth, int oHeight,
int nWidth, int nHeight);
// Изменение размера изображения с нелинейной интерполяцией
bool ResizeNolinear(UColorT *output, UColorT* input,
int oWidth, int oHeight,
int nWidth, int nHeight);
// -----------------------
// -----------------------
// Методы выделения контуров
// -----------------------
// Оригинальный алгоритм
void NativeLooping(UBitmap *target);
// Фильтр Собеля
void SobelLooping(UBitmap *target);
// -----------------------
};
}
#endif