首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++中将像素值转换为图像

在c++中将像素值转换为图像
EN

Stack Overflow用户
提问于 2014-02-28 08:45:51
回答 1查看 1.5K关注 0票数 0

我有一个有两列的文件。第一列具有所有像素位置,第二列具有与该像素对应的值。这个像素值非常小(E-9阶).

我想要创建一个大小为512x512的图像,以相同颜色的文本文件显示像素位置。因此,像素值并不重要。

请告诉我如何在c++中这样做,还需要什么额外的库。

输入文件

872 4.19078e-010

1000 4.59096 e-009

1127 1.2677e-010

1128 8.78192e-010

1255 1.59879 e-009

7233 9.87113 e-010

7234 2.1458e-009

8130 8.00793e-007

8131 9.02571 e-007

8258 8.23907 e-007

8259 6.44226e-007

8264 1.68967e-009

8265 1.9245 e-009

8385 7.74323 e-010

8386 2.10707e-009

8387 2.77237e-009

8388 2.12874e-009

8513 2.81146e-010

8516 1.08573e-008

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-28 10:40:02

我建议您查看netpbm包,特别是PGM格式-可移植的Greymap 这里。在没有库的情况下用C编写是非常容易的,因为它是纯的ASCII,对于小文件很好,而且很容易处理。基本上,您的文件在PGM格式中如下所示:

代码语言:javascript
复制
P2
512 512
255
0 0 0 0 0 0 0 0 0 0 0 0 0 0 .... 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 .... 0
0 0 0 0 0 0 0 0 0 255 .... 0 0 0 0 0 0

P2只是说它是灰度和ASCII。512 512是尺寸,255是最大像素亮度。然后,您有512扫描线的图像,每一个有512个像素值之间的空格。黑色像素为零。白色像素为255。因此,上述示例中的255是接近第二条扫描线末尾的像素号872。

一旦您有了PGM/PBM文件,您就可以轻松地用ImageMagick将其转换为其他任何东西,甚至可以将其直接读取到许多应用程序中,例如Photoshop。

有一个示例这里,请查看第51行前面的P5格式示例,它类似于P2格式,但使用二进制格式,而不是ASCII。

以下是我为您提供的信息:

后来添加了

为了好玩,我使用awk转换了您的数据,根本不需要任何C编程。它是这样的一行(为了可读性,在三行线上展开):

代码语言:javascript
复制
awk 'BEGIN {print "P5\n512 512\n255\n";for(i=0;i<512*512;i++)p[i]=0}
     {p[$1]=255}
     END {for(i=0;i<512*512;i++)printf "%c",p[i]}' yourfile > image.pgm

也就是说,在脚本的开头(即BEGIN{}),输出头部的P5\n512 512\n255,并使像素数组p[]的所有元素为零。然后,在随后的所有行中,将输入文件的每一行的第一个值($1)索引的像素设置为255。然后,在末尾(END{})打印像素数组p[]的所有元素,并将全部内容发送到一个名为image.pgm的文件中。

如果你喜欢使用这个,你将需要下载awk可能从这里

编辑的

如果您希望对每个像素使用原始值,而不是对输入文件中的每个像素使用纯白色(255),那么我们需要做更多的工作。首先,当我们读取每个像素时,我们必须保存它的值(它在$2中)以及它的位置。最后,我们必须将值缩放到某个范围,因此我任意选择文件中的最小值将导致中间灰色(即输出图像中的value=127 ),而文件中的最大值将导致完全白色(即输出图像中的value=255 )。您的输入文件中的所有其他像素都将位于中间灰色(127)和白色(255)之间的相应(线性)位置。输入文件中没有的任何像素都将是黑色的。

代码语言:javascript
复制
awk 'BEGIN {print "P5\n512 512\n255\n";for(i=0;i<512*512;i++)p[i]=0}

     {p[$1]=$2}

     END {
        # Find min and max readings so we can scale them into range [128,255]
        max=0;min=1000000
        for(i=0;i<512*512;i++){
           if(p[i]!=0){
              if(p[i]>max)max=p[i]
              if(p[i]<min)min=p[i]
           }
        }
        # Calculate range of readings
        range=max-min
        scalefactor=128/range
        # Scale all readings
        for(i=0;i<512*512;i++){
           if(p[i]!=0){
              p[i]=127+int((p[i]-min)*scalefactor)
           }
        }
        # Print the values to the pgm file
        for(i=0;i<512*512;i++)printf "%c",p[i]
     }' yourfile > image.pgm

我从这段代码得到的直方图如下:

代码语言:javascript
复制
    14: (127,127,127) #7F7F7F gray(127)
     1: (128,128,128) #808080 gray(128)
     1: (218,218,218) #DADADA gray(218)
     1: (240,240,240) #F0F0F0 gray(240)
     1: (243,243,243) #F3F3F3 gray(243)
     1: (255,255,255) #FFFFFF gray(255)

因此,它的结果是14个像素的中灰色(127),1个像素128,一个像素218,一个218,一个240,一个243和一个255 (白色)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22090208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档