2 * Image Library -- Detection of textured images
4 * (c) 2006 Pavel Charvat <pchar@ucw.cz>
6 * This software may be freely distributed and used according to the terms
7 * of the GNU Lesser General Public License.
12 #include "sherlock/sherlock.h"
13 #include "images/images.h"
14 #include "images/signature.h"
15 #include "images/math.h"
19 #define MAX_CELLS_COLS 4
20 #define MAX_CELLS_ROWS 4
23 image_sig_detect_textured(struct image_sig_data *data)
25 if (image_sig_textured_threshold <= 0)
27 DBG("Zero textured threshold.");
31 uns cols = data->cols;
32 uns rows = data->rows;
33 uns cell_cols = MIN((cols + 1) / 2, MAX_CELLS_COLS);
34 uns cell_rows = MIN((rows + 1) / 2, MAX_CELLS_ROWS);
35 uns cell_x[MAX_CELLS_COLS + 1];
36 uns cell_y[MAX_CELLS_ROWS + 1];
38 u32 cnt[IMAGE_REG_MAX];
40 if (cell_cols * cell_rows < 4)
42 DBG("Image is not textured.");
46 DBG("Detecting textured image... cols=%u rows=%u cell_cols=%u cell_rows=%u", cols, rows, cell_cols, cell_rows);
48 /* Compute cells boundaries */
49 for (i = 1, j = 0; i < cell_cols; i++)
50 cell_x[i] = fast_div_u32_u8(j += cols, cell_cols);
52 cell_x[cell_cols] = cols;
53 for (i = 1, j = 0; i < cell_rows; i++)
54 cell_y[i] = fast_div_u32_u8(j += rows, cell_rows);
56 cell_y[cell_rows] = rows;
58 /* Preprocess blocks */
59 for (uns i = 0; i < data->regions_count; i++)
60 for (struct image_sig_block *block = data->regions[i].blocks; block; block = block->next)
65 for (uns j = 0; j < cell_rows; j++)
66 for (uns i = 0; i < cell_cols; i++)
69 bzero(cnt, data->regions_count * sizeof(u32));
70 struct image_sig_block *b1 = data->blocks + cell_x[i] + cell_y[j] * cols, *b2;
71 for (uns y = cell_y[j]; y < cell_y[j + 1]; y++, b1 += cols)
74 for (uns x = cell_x[i]; x < cell_x[i + 1]; x++, b2++)
80 for (uns k = 0; k < data->regions_count; k++)
82 int a = data->blocks_count * cnt[k] - cell_area * data->regions[k].count;
83 e += (double)a * a / ((double)isqr(data->regions[k].count) * cell_area);
87 DBG("Coefficient=%g", (double)e / (data->regions_count * data->blocks_count));
90 if (e < image_sig_textured_threshold * data->regions_count * data->blocks_count)
92 data->flags |= IMAGE_SIG_TEXTURED;
93 DBG("Image is textured.");
96 DBG("Image is not textured.");