使用Imagemagick将RAW转换为PNG

3
我正在尝试使用Imagemagick将RAW图像转换为PNG。我正在使用的Imagemagick版本是6.7.8-9。
要转换的RAW图像是:

https://drive.google.com/file/d/1V1c-ytjkLaCM3KbAc6Yxj2nfWzNkYohc/view?usp=sharing

我的客户给了我一个包含1000多张DICOM图像的大型RAW图像。首先,我使用命令对其中的一张图像进行裁剪(由于裁剪命令无法正常工作,所以使用了convert命令):
convert -size 512x512 -depth 16 UYVY:original.raw result.raw

结果.raw在ImageJ上看起来很好。 现在,我不知道如何从中获取PNG。 我尝试了一些命令:
这个生成的质量非常差:
convert -size 512x512 -depth 16 gray:result.raw result.png

这个会产生绿色的图像:
convert -size 512x512 -depth 16 uyvy:result.raw result.png

如果我在ImageJ中打开result.raw并保存为PNG格式,它可以完美地工作。

一个正确的结果是什么样子的?请在ImageJ中发布一张屏幕截图展示正确的结果。你的原始数据是有符号还是无符号的16位? - fmw42
尝试使用以下命令:convert -size 512x512 -depth 16 uyvy:result.raw -separate +channel result.png,然后选择你认为最好的通道。 - fmw42
@fmw42 谢谢你的回复。你的命令生成了更好的图像,但它们与原始的RAW图像仍然有些不同。 这是从你的命令生成的PNG之一: 链接 这个PNG是由ImageJ创建的,而这就是我需要的那个: 链接 我的RAW是16位有符号的。我的客户刚告诉我RAW是1通道(单色),所以应该转换为3通道(RGB)灰度,然后再转换为PNG。PNG就不会出现奇怪的颜色了。 - ASH
我认为问题在于ImageMagick正在处理无符号16位数据,而您的数据是有符号的。我不知道ImageMagick是否能够处理有符号数据。您应该在ImageMagick论坛上询问是否有一种方法可以读取有符号的原始图像数据。 - fmw42
实际上,我的客户说 RAW 文件应该在 ImageJ 中以 "16 位有符号的小端字节序" 打开。因此,正确的图像应该像这样:链接 现在问题是如何添加 "signed" 和 "little endian"。我尝试了类似以下的命令,但没有成功:convert -size 512x512 -depth 16 -define png:swap-bytes=on -define signed uyvy:result.raw result.jpg - ASH
你有考虑过使用像darktable这样的真正的RAW处理器吗?或者使用ufraw? - Romeo Ninov
2个回答

2

我从Imagemagick社区得到了答案。首先,下面的代码获取原始raw文件中的第一张图片是错误的。

convert -size 512x512 -depth 16 UYVY:original.raw result.raw

这是正确的方式(512*512*2字节=524228)

head --bytes 524288 original.raw >firstimage.raw

然后将其转换为PNG格式:
magick -size 512x512 -depth 16 gray:firstimage.raw -evaluate AddModulus 50% -auto-level x.png

2
这里有另一种使用ImageMagick的方法,我认为更符合你的带符号原始数据直觉。我只需使用-define quantum-format=signed指定数据带符号即可。然后使用-auto-level将结果拉伸到完整的动态范围。
convert -size 512x512 -depth 16 -define quantum:format=signed gray:original.raw -auto-level result.png

如果使用ImageMagick 7,则将convert替换为magick。

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