0

私は現在、4x4 の順序付きディザ マトリックスを使用して 24bpp の画像を 3bpp の画像に縮小する必要があるプロジェクトを行っています。しかし、ディザリング処理を行った後、私の画像は約 1/3 しか表示されません。私が間違っていることを誰かが知っていますか?

ソース:

#include <stdio.h>
#include <fstream>

/*24 bit per pixel - 3 bit per pixel dither*/
/*Use the 4x4 Ordered Dither Matrix:

    [1 9 3 11]
    [13 5 15 7]
    [4 12 2 10]
    [16 8 14 6]

*/
int checkColor(int a, int b);

unsigned char buf[512][512];
unsigned char out[512][512];
float ratio = 1.0 / 17;


int main(){

    FILE *fp, *output;
    int i, j, k, l;

    /*dither matrix*/
    unsigned int dith[4][4] = {{1, 9, 3, 11}, {13, 5, 15, 7}, {4, 12, 2, 10}, {16, 8, 14, 6}};


    if((fp = fopen("LennaRGB512.data", "rb")) == NULL){
        printf("error opening file\n");
    }

    for (i = 0; i < 512; i++) {
        for (j = 0; j < 512; j++) {
            buf[i][j] = fgetc(fp); /*Put data in buffer*/
        }
    }

    i = 0;
    j = 0;

    int x, y;
    int bd = 64;
    for (k = 0; k < 512; k++){
        for (l = 0; l < 512; l++){
            int oldPixel = buf[k][l];
            int value = (oldPixel + (ratio * dith[k%4][l%4]));

            int r = ((oldPixel >> 16) & 0xff) + value;
            int g = ((oldPixel >> 8) & 0xff) + value;
            int b = (oldPixel & 0xff) + value;

            int newPixel = 0x000000 | checkColor(r, bd) << 16 | checkColor(g, bd) << 8 | checkColor(b, bd);
            out[k][l] = newPixel;
        }
    }


    output = fopen("converted_img.data", "wb");

    for (i = 0; i < 512; i++){
        for (j = 0; j < 512; j++){
            fputc(out[i][j], output);
        }
    }

    fclose(output);
    fclose(fp);

    return 0;
}

int checkColor(int a, int b){
    return a / b * b;
}

前の画像は 512x512 の画像ですが、ディザリングされた出力画像は画像の一部 (512x170) にすぎません

4

1 に答える 1

1

ソース イメージは 24bpp です。これは、1 ピクセルあたり 3 バイトです。幅 512 バイト、高さ 512 バイトのみを読み取る場合、これは画像の 512x170 (512/3) を正確に表します。最初に、1 ピクセルあたり 3 バイトを読み取る必要があります。

また、3bppint newPixelではなく、char に格納することで 32bpp に変換しているため、値がオーバーフロー (切り捨て) されます。

さらに、なぜあなたのディザ パターンは 4bpp なのですか? (2^4 = 16 個の値)。

先生の説明が下手だったようです。

于 2016-10-12T21:56:13.787 に答える