2015-04-16 4 views
0

Мне нужно прочитать изображение в градациях серого .bmp в 2D-матрице. Значениями (int) на матрице будут соответствующие уровни градаций серого на изображении (от 0 до 255).Как импортировать изображение в оттенках серого в двумерную матрицу в C?

Будучи более конкретным, давайте предположим, что у меня есть 8-битное изображение в сером цвете 4x4.

Я хочу, чтобы преобразовать его в 2d матрицы, значения которых будут полутоновые уровни, например:

| 0 ...... 2 ...... 4 ..... ..5 |

| 10 .... 11 .... 12 .... 10 |

210..200..150..98 |

| 1 ..... 10 .... 50 ..... 88 |

До сих пор мне удалось импортировать изображение в оттенках серого в 3 матрицы (RGB), но когда я пытаюсь преобразовать его в одну матрицу (в оттенках серого) с использованием коэффициентов преобразования, это не сработает. Изображение стало иным, чем оригинал.

Функция преобразования, я использую это: ...

for (int i = 0; i < l; i++) 
    for (int j = 0; j < c; j++) 
    { 
    b[i][j] = (int)(0.11*b[i][j] + 0.59*g[i][j] + 0.3*r[i][j]); 
    g[i][j] = b[i][j]; 
    r[i][j] = g [i][j]; 
    } 
} 
+0

Лично я не стал бы беспокоиться о каком-то смешном, тайном, нелогичном формате Microsoft от 80-х годов. Я бы использовал ImageMagick, чтобы преобразовать его в файл PGM (Portable Grey Map), который вы сможете прочитать примерно в 3 строках C. Команда для конвертирования - это 'convert image.bmp image.pgm'. Дополнительная информация: http: //en.wikipedia.org/wiki/Netpbm_format –

ответ

1

Проблема заключается вероятно должны подписать расширение на char типа. Если вы добавили каждый байт в unsigned char, он должен работать.

b[i][j] = (int)(0.11*(unsigned char)b[i][j] + 0.59*(unsigned char)g[i][j] + 0.3*(unsigned char)r[i][j]); 

Edit: просто заметил, что значения уже int, так что расширение знака уже произошло. В этом случае просто замаскируйте его.

b[i][j] = (int)(0.11*(0xff&b[i][j]) + 0.59*(0xff&g[i][j]) + 0.3*(0xff&r[i][j]));