1

MATLAB での画像の読み込みを高速化するために、マルチページの TIFF ファイルを使用しています。これは、MATLAB の単純な imread よりもはるかに高速に動作します。しかし、私の問題は、TIFF ファイルのサイズが通常の画像よりもかなり大きい (10 倍以上) ことです。そのため、圧縮オプションを調べています。これらのオプションのいくつかを (以下に添付したコードを使用して) 試しましたが、一部は機能せず、空のファイルが生成され、残りは速度が低下します。

サイズと速度の両方を持つ方法はありますか?

ありがとうございました

PS: コードをここに置きます。私が間違っている場合は教えてください。

#include <stdio.h>
#include <time.h>
#include "tiffio.h"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace std;

#define XSIZE 1280
#define YSIZE 720
#define NPAGES 1000
#define CHANNEL 3

int main (int argc, char **argv)
{
uint32 image_width, image_height;
float xres, yres;
uint16 spp, bpp, photo, res_unit;
TIFF *out;
int i, j;
uint16 page;
Mat img;
int COMPRESSION_TAG = atoi(argv[1]);

unsigned char *array = new unsigned char [XSIZE * YSIZE*3];

char name[20];

out = TIFFOpen("myfile.tif", "w");
image_width = XSIZE;
image_height = YSIZE;


spp = CHANNEL; /* Samples per pixel */
bpp = 8; /* Bits per sample */
photo = PHOTOMETRIC_MINISBLACK;
for (page = 0; page < NPAGES; page++)
{
    sprintf(name, "5_29%03d.jpg", page);
    img = imread(name);
    array = img.data;
    TIFFSetField(out, TIFFTAG_IMAGEWIDTH, image_width );
    TIFFSetField(out, TIFFTAG_IMAGELENGTH, image_height);
    TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, bpp);
    TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, spp);
    TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
    TIFFSetField(out, TIFFTAG_PHOTOMETRIC, photo);
    TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_BOTLEFT);
    TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_TAG);
    /* It is good to set resolutions too (but it is not nesessary) */
    xres = yres = 100;
    res_unit = RESUNIT_INCH;
    TIFFSetField(out, TIFFTAG_XRESOLUTION, xres);
    TIFFSetField(out, TIFFTAG_YRESOLUTION, yres);
    TIFFSetField(out, TIFFTAG_RESOLUTIONUNIT, res_unit);

    /* We are writing single page of the multipage file */
    TIFFSetField(out, TIFFTAG_SUBFILETYPE, FILETYPE_PAGE);
    /* Set the page number */
    TIFFSetField(out, TIFFTAG_PAGENUMBER, page, NPAGES);

    for (j = 0; j < image_height; j++)
        TIFFWriteScanline(out, &array[3*j * image_width], j, 0);

    TIFFWriteDirectory(out);
}

TIFFClose(out);

    return 0;
}
4

0 に答える 0