将二维数组转换为C语言中的灰度图像

4
我使用头文件 (LenaArray.h) 导入了 Lena 的 2D 数组:int lena [511][511] = {162,162,162,etc...},但现在我想将它转换成灰度图像,不知道怎么做,请帮忙。这是我想打印的 Lena 图像的链接:Image of Lena I'm trying to print
#include <stdio.h>
#include "LenaArray.h" 

int main () {

int i,j;

int width = 511; 
int height = 511;

for (i = 0; i < height; i ++ )
{
    for(j = 0; j < width; j ++)
    {
        printf("%d",&lena[i][j]);
    }

}


}

我不确定 i ++j ++ 是否符合标准。我认为它们不符合标准。 - RobertS supports Monica Cellio
2
++s 没有任何问题。一个主要的问题是你 printf 里面的 '&' 符号。你不想输出数组值的地址,而是要打印实际值。此外,你需要知道该值代表什么。它是否以某种方式编码了 RGB 值?它是调色板中的索引吗?在我看来,它已经是灰度值。那你是要在屏幕或打印机上呈现实际图像吗?你需要一些图形库来完成这个任务。 - Lee Daniel Crocker
1
你没有解释数组的格式。红色、绿色和蓝色组件是如何存储的?主要技术是使用关系式 float Gray = 0.2989f*Red + 0.5870f * Green + 0.1140f * Blue。当然,这会产生与组件相同比例的浮点数灰度值。对于大多数情况,您需要将 Gray 四舍五入到最接近的整数以创建结果图像。类似 (int)(Gray + 0.5) - Gene
@Gene 可能性存在,但不太可能,因为如果你将四个8位数字打包到一个 int 中,你很可能得到比162(第一个值)大得多的东西,而162看起来像是一个单独的无符号8位数字,范围在0..255之间。并且,根据字节顺序,如果它被打包了,那么它几乎是纯红色、绿色或蓝色,或者几乎是不透明/透明的黑色。虽然有可能被打包,但我同意这种可能性不大。 - Mark Setchell
请分享 LenaArray.h 文件或链接,谢谢。 - Mark Setchell
显示剩余5条评论
1个回答

1
#include <stdio.h>

typedef unsigned char U8;
typedef struct { U8 p[4]; } color;


U8 lena[511][511];

void save(char* file_name,int width,int height)
{

    FILE* f = fopen(file_name, "wb");


    color tablo_color[256];
    for (int i = 0; i < 256; i++)
        tablo_color[i] = { (U8)i,(U8)i,(U8)i,(U8)255 };//BGRA 32 bit


    U8 pp[54] = { 'B', 'M', 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0 ,
                     40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 32 };
    *(int*)(pp + 2) = 54 + 4 * width * height;  //file size
    *(int*)(pp + 18) = width;
    *(int*)(pp + 22) = height;
    *(int*)(pp + 42) = height * width * 4;      //bitmap size
    fwrite(pp, 1, 54, f);


    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            U8 indis = lena[i][j];
            fwrite(tablo_color+indis,4,1,f);
        }
    }

    fclose(f);

}

int main()
{

    for (int i = 0; i < 511; i++)
    {
        for (int j = 0; j < 511; j++)
        {
            lena[i][j]=i+j;
        }
    }

    save("test.bmp", 511, 511);

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接