Чтение изображений .tif в C с использованием libtiff возвращает один столбец

Я хочу использовать библиотеку «libtiff» для чтения значений интенсивности 8-битных пикселей из изображений «.tiff». я наткнулся на этот код и изменил его, чтобы считывать 8-битные значения по желанию и возвращать правильные значения только для одного столбца.

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include "tiffio.h"
#define imsize 286628
 int count;
 int count2;
 uint8* im;
 uint32 imagelength;
 uint32 width;
int main(){

im = (uint8*)malloc(imsize*sizeof(uint8));
TIFF* tif = TIFFOpen("image1.tif", "r");
    if (tif) {

        tsize_t scanline;
        tdata_t buf;
        uint32 row;
        uint32 col;


        uint16 nsamples;

        TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &nsamples);
        TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &imagelength);
        TIFFGetField(tif,TIFFTAG_IMAGEWIDTH,&width);

        scanline = TIFFScanlineSize(tif);
        buf = _TIFFmalloc(scanline);
        uint8* data;

        for (row = 0; row < imagelength; row++)
        {
            TIFFReadScanline(tif, buf, row,1);
            count2++;
            for (col = 0; col < scanline; col++)
                data = (uint8*)buf;
                //printf("%d\n",col); remains the same not incrementing
                printf("%d ", *data);//printing for testing need only to copy to an array to access by index
                im[count] = *data;
                count++;
            printf("\n");

        }
        printf("im[1]= %d\n im[2] = %d \n im[3] = %d \n im[286628] = %d\n",im[0],im[1],im[2],im[286627]);
        _TIFFfree(buf);
        TIFFClose(tif);
        free(im);
    }
    printf("num of cols= %d\n",count);
    printf("num of rows = %d\n",count2);//both counts print col size
    printf("width = %d\n",width); //prints row size

    return 0;

}

во вложенном цикле for, если я добавляю скобки, циклы перебирают правильное количество пикселей (для этого примера #of-pixels = 286628, изображение 547x524), но с неправильными значениями. если я оставлю скобки удаленными, я получу правильные значения, но для первого столбца (всего 547 значений).

Какие изменения необходимо внести, чтобы правильно перебрать все пиксели?

примечание: я пытаюсь получить матрицу со значениями в виде matlabs "imread()"


person Nofal    schedule 31.12.2018    source источник


Ответы (1)


В цикле col каждый столбец делает одно и то же, используя data = (uint8*)buf;, который, кажется, является данными первого столбца. В цикле также отсутствуют { фигурные скобки }.

Переместить линию

data = (uint8*)buf;

вне цикла столбца и увеличивайте его внутри цикла.

for (row = 0; row < imagelength; row++)
{
    TIFFReadScanline(tif, buf, row,1);
    count2++;
    data = (uint8*)buf;                     // move up
    for (col = 0; col < scanline; col++)
    {                                       // add braces
        printf("%d ", *data);
        im[count] = *data;
        count++;
        data++;                             // increment buffer pointer
    }
    printf("\n");
}
person Weather Vane    schedule 31.12.2018
comment
Спасибо, это сработало! , я пробовал то же самое раньше, но я не добавлял данные ++. Я считаю, что теперь у меня есть четкое понимание того, как на самом деле работает код. - person Nofal; 01.01.2019