Как я могу просто загрузить оттенки серого tiff в libtiff и получить массив интенсивностей пикселей?
Я пытаюсь понять изображения еще немного, и у меня много проблем. Из использования matlab у меня есть опыт использования imread ('test.tif'), и получить красивую матрицу строк против столбцов, где у вас есть интенсивность каждого пикселя как целое число. Таким образом, изображение 720 x 250 даст матрицу 720 x 250, где каждая ячейка содержит интенсивность пикселя, в масштабе от 0-255 (в зависимости от типа данных). Итак, 0 было черным, 255-белым.
Это было так просто и так много смысла. Теперь я пытаюсь использовать libtiff, и я действительно борюсь. Я хочу сделать то же самое-получить доступ к этим пикселям, и я просто не могу его получить.
У меня есть следующий код:
int main(int argc, char *argv[]){
TIFF* tif = TIFFOpen( argv[1], "r");
FILE *fp = fopen("test2.txt", "w+");
if (tif) {
int * buf;
tstrip_t strip;
uint32* bc;
uint32 stripsize;
TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &bc);
stripsize = bc[0];
buf = _TIFFmalloc(stripsize);
for(strip = 0; strip < TIFFNumberOfStrips(tif); strip++ ) {
if( bc[strip] > stripsize) {
buf = _TIFFrealloc(buf, bc[strip]);
stripsize = bc[strip];
}
TIFFReadRawStrip(tif, strip, buf, bc[strip]);
}
int i;
for (i=0; i<stripsize; i++) {
if ( i % 960 ==0 )
fprintf(fp, "n");
fprintf(fp,"%d ", buf[i]);
}
_TIFFfree(buf);
TIFFClose(tif);
}
exit(0);
}
но я получаю совершенно бессмысленные результаты-просто совершенно сумасшедшие числа. Ничего похожего на числа, которые я вижу при загрузке изображения в matlab.
Как я могу просто получить доступ к значениям пикселей и посмотреть на них?
спасибо много.
3 ответов
Я думаю, вы должны прочитать использование статьи библиотеки TIFF. Он содержит достаточно информации, чтобы начать работу с libtiff.
вот некоторый код для чтения изображений scanlines и печати значений каждого образца.
main()
{
TIFF* tif = TIFFOpen("myfile.tif", "r");
if (tif) {
uint32 imagelength;
tsize_t scanline;
tdata_t buf;
uint32 row;
uint32 col;
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
scanline = TIFFScanlineSize(tif);
buf = _TIFFmalloc(scanline);
for (row = 0; row < imagelength; row++)
{
TIFFReadScanline(tif, buf, row);
for (col = 0; col < scanline; col++)
printf("%d ", buf[col]);
printf("\n");
}
_TIFFfree(buf);
TIFFClose(tif);
}
}
Что касается этой статьи, я думаю, что будет лучше использовать подход TIFFRGBAImage, потому что, как оказалось, файл TIFF может быть одним из разных форматов: плиточный, scanline-based и strip-oriented. Вот пример из той же статьи.
TIFF* tif = TIFFOpen(argv[1], "r");
if (tif) {
uint32 w, h;
size_t npixels;
uint32* raster;
TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h);
npixels = w * h;
raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32));
if (raster != NULL) {
if (TIFFReadRGBAImage(tif, w, h, raster, 0)) {
...process raster data...
}
_TIFFfree(raster);
}
TIFFClose(tif);
}
растр-это массив uint32 (максимальное значение= 0xffffffff) но вы пытаетесь прочитать 16-битный массив (максимальное значение 0xffff). вы столкнетесь с проблемами конверсии 32bit в 16bit. Чтение метода scanline-лучший способ сделать это. Таким образом, вы можете преобразовать void* buf в uint16* и получить доступ к значениям пикселей.
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <inttypes.h>
#include "tiffio.h"
using namespace std;
void printArray(uint16 * array, uint16 width);
int main()
{
TIFF* tif = TIFFOpen("16bit_grayscale_image.tif", "r");
if (tif) {
uint32 imagelength,height;
tdata_t buf;
uint32 row;
uint32 config;
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);
TIFFGetField(tif, TIFFTAG_PLANARCONFIG, &config);
buf = _TIFFmalloc(TIFFScanlineSize(tif));
uint16 s, nsamples;
uint16* data;
TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &nsamples);
for (s = 0; s < nsamples; s++)
{
for (row = 0; row < imagelength; row++)
{
TIFFReadScanline(tif, buf, row, s);
data=(uint16*)buf;
printArray(data,imagelength);
}
// printArray(data,imagelength,height);
}
_TIFFfree(buf);
TIFFClose(tif);
}
exit(0);
}
void printArray(uint16 * array, uint16 width)
{
uint32 i;
for (i=0;i<width;i++)
{
printf("%u ", array[i]);
}
printf("\n");
}