我有一个有两列的文件。第一列具有所有像素位置,第二列具有与该像素对应的值。这个像素值非常小(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
发布于 2014-02-28 10:40:02
我建议您查看netpbm包,特别是PGM格式-可移植的Greymap 这里。在没有库的情况下用C编写是非常容易的,因为它是纯的ASCII,对于小文件很好,而且很容易处理。基本上,您的文件在PGM格式中如下所示:
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 0P2只是说它是灰度和ASCII。512 512是尺寸,255是最大像素亮度。然后,您有512扫描线的图像,每一个有512个像素值之间的空格。黑色像素为零。白色像素为255。因此,上述示例中的255是接近第二条扫描线末尾的像素号872。
一旦您有了PGM/PBM文件,您就可以轻松地用ImageMagick将其转换为其他任何东西,甚至可以将其直接读取到许多应用程序中,例如Photoshop。
有一个示例这里,请查看第51行前面的P5格式示例,它类似于P2格式,但使用二进制格式,而不是ASCII。
以下是我为您提供的信息:

后来添加了
为了好玩,我使用awk转换了您的数据,根本不需要任何C编程。它是这样的一行(为了可读性,在三行线上展开):
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)之间的相应(线性)位置。输入文件中没有的任何像素都将是黑色的。
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我从这段代码得到的直方图如下:
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 (白色)。
https://stackoverflow.com/questions/22090208
复制相似问题