【问题标题】:How do I import a grayscale image into a 2D matrix in C?如何将灰度图像导入 C 中的二维矩阵?
【发布时间】:2015-06-22 21:09:32
【问题描述】:

我需要将 .bmp 灰度图像读入二维矩阵。矩阵上的值 (int) 将是图像上相应的灰度级别(从 0 到 255)。

更具体地说,假设我有一个 4x4 像素的 8 位灰度图像。

我想将其转换为二维矩阵,其值将是灰度级别,例如:

|0......2......4.......5 |

|10....11....12....10|

|210..200..150..98|

|1.....10....50.....88|

到目前为止,我已经设法将灰度图像导入 3 矩阵 (RGB),但是当我尝试使用转换因子将其转换为单个矩阵(灰度)时,它不起作用。图像与原始图像不同。

我正在使用的转换函数是: ...

for (int i = 0; i < l; i++) 
    for (int j = 0; j < c; j++) 
    { 
     b[i][j] = (int)(0.11*b[i][j] + 0.59*g[i][j] + 0.3*r[i][j]);
     g[i][j] = b[i][j];
     r[i][j] = g [i][j]; 
    } 
}

【问题讨论】:

  • 就个人而言,我不会为 80 年代一些荒谬、神秘、不合逻辑的 Microsoft 格式而烦恼。我会使用 ImageMagick 将其转换为 PGM 文件(便携式灰色地图),您将能够在大约 3 行 C 中读取该文件。转换命令是 convert image.bmp image.pgm 更多信息:en.wikipedia.org/wiki/Netpbm_format

标签: c image-processing matrix bmp grayscale


【解决方案1】:

问题是可能由于char 类型的符号扩展。如果您将每个字节转换为unsigned char,它应该可以工作。

b[i][j] = (int)(0.11*(unsigned char)b[i][j] + 0.59*(unsigned char)g[i][j] + 0.3*(unsigned char)r[i][j]);

编辑:刚刚注意到值已经是int,所以符号扩展已经发生。在这种情况下,只需将其屏蔽即可。

b[i][j] = (int)(0.11*(0xff&b[i][j]) + 0.59*(0xff&g[i][j]) + 0.3*(0xff&r[i][j]));

【讨论】:

    猜你喜欢
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 2015-09-25
    • 1970-01-01
    相关资源
    最近更新 更多