如何使用ImageMagick获取整个图像中文本的RGB像素值?

8

我是第一次使用ImageMagick。

我想要知道整个像素的RGB颜色。

我已经知道如何获取一个像素的RGB颜色。

但是我不知道如何用一个命令获取所有像素的数据。

对每个像素执行每个命令非常耗费资源,不能使用。

最好的命令结果如下...

#x,y={R,G,B}
1,1={100,230,105},
1,2={100,230,105},
1,3={100,230,135},
...
...

什么平台/操作系统?使用什么编程语言?还是命令行?你总体上想做什么? - Mark Setchell
我将在JAVA中调用命令行。 我想要识别一张图片是否只由一种颜色组成。(单色图像) Linux/CentOS和JAVA。 - SHRIN
1
我认为标题应该是“如何获取整个图像的文本中的RGB像素值”。我认为这就是你所询问的,用流利的英语表达出来。(无任何不敬之意。) - ttulinsky
2个回答

13

另一种选择

如果您想为了更好的性能而分摊运行identify的成本,您可以尝试以下方法 - 其中%k给出颜色数量,%n给出文件名:

identify -format "%k:%f\n" *.jpg

输出

290972:7T6Dj.jpg
3641:a.jpg
8349:b.jpg
3019:back.jpg
3122:background.jpg
83155:blion.jpg
35136:brDaP.jpg
37106:cartesian.jpg

在Java中必须有一个能够运行该命令并获取输出的system()shell_exec()popen()

更新的答案

如果您只想检查图像是否只包含单一颜色,您可以要求ImageMagick计算颜色的数量,如下所示(使用与下面相同的图像):

identify -format "%k" a.gif
3

我不确定你如何在Java中做到这一点,但在Ruby中你可以这样做:
image["%[k]"]

在Perl中,你可以这样做:
my $image = Image::Magick->new;
$image->ReadImage("c.png");

print $image->Get("%[k]");

原始回答

你没有提供关于你的环境、编程语言、应用程序或其他任何详细信息,不过,以下内容可能会帮助你入门。

让我们从命令行创建一个小图像,包含3个正方形,每个正方形都是4x4像素,一个是红色的,一个是绿色的,一个是蓝色的,都在水平排列:

convert -size 4x4 xc:red xc:green xc:blue +append a.gif

我会放大它,这样你就能看清楚了。

enter image description here

现在,我们可以以文本格式来看它:
convert -size 4x4 xc:red xc:green xc:blue +append -depth 8 txt:
# ImageMagick pixel enumeration: 12,4,255,srgb
0,0: (255,0,0)  #FF0000  red
1,0: (255,0,0)  #FF0000  red
2,0: (255,0,0)  #FF0000  red
3,0: (255,0,0)  #FF0000  red
4,0: (0,128,0)  #008000  green
5,0: (0,128,0)  #008000  green
6,0: (0,128,0)  #008000  green
7,0: (0,128,0)  #008000  green
8,0: (0,0,255)  #0000FF  blue
9,0: (0,0,255)  #0000FF  blue
10,0: (0,0,255)  #0000FF  blue
11,0: (0,0,255)  #0000FF  blue
0,1: (255,0,0)  #FF0000  red
1,1: (255,0,0)  #FF0000  red
2,1: (255,0,0)  #FF0000  red
3,1: (255,0,0)  #FF0000  red
4,1: (0,128,0)  #008000  green
5,1: (0,128,0)  #008000  green
6,1: (0,128,0)  #008000  green
7,1: (0,128,0)  #008000  green
8,1: (0,0,255)  #0000FF  blue
9,1: (0,0,255)  #0000FF  blue
10,1: (0,0,255)  #0000FF  blue
11,1: (0,0,255)  #0000FF  blue
0,2: (255,0,0)  #FF0000  red
1,2: (255,0,0)  #FF0000  red
2,2: (255,0,0)  #FF0000  red
3,2: (255,0,0)  #FF0000  red
4,2: (0,128,0)  #008000  green
5,2: (0,128,0)  #008000  green
6,2: (0,128,0)  #008000  green
7,2: (0,128,0)  #008000  green
8,2: (0,0,255)  #0000FF  blue
9,2: (0,0,255)  #0000FF  blue
10,2: (0,0,255)  #0000FF  blue
11,2: (0,0,255)  #0000FF  blue
0,3: (255,0,0)  #FF0000  red
1,3: (255,0,0)  #FF0000  red
2,3: (255,0,0)  #FF0000  red
3,3: (255,0,0)  #FF0000  red
4,3: (0,128,0)  #008000  green
5,3: (0,128,0)  #008000  green
6,3: (0,128,0)  #008000  green
7,3: (0,128,0)  #008000  green
8,3: (0,0,255)  #0000FF  blue
9,3: (0,0,255)  #0000FF  blue
10,3: (0,0,255)  #0000FF  blue
11,3: (0,0,255)  #0000FF  blue

但是你说获取一个像素需要太长时间,所以你可以将图像转换为一个只包含纯RGB值的文件,然后读取它。
convert -size 4x4 xc:red xc:green xc:blue +append -depth 8 x.rgb

如果我们查看文件,我们可以看到它的长度为144个像素,其中有16个红色像素,16个绿色像素,16个蓝色像素 - 因此总共有48个像素 - 每个像素都有一个字节的红色、绿色和蓝色。(48x3=144)
ls -l x.rgb
-rw-r--r--  1 mark  staff  144 29 Oct 11:06 x.rgb

ImageMagick使用文件扩展名来确定格式,而rgb表示RGB!如果您想使用与.rgb不同的扩展名,可以像这样告诉ImageMagick:
convert -size 4x4 xc:red xc:green xc:blue +append -depth 8 RGB:x.raw

现在让我们以十六进制查看文件内容:
xxd -g3 -c12 x.rgb
0000000: ff0000 ff0000 ff0000 ff0000  ............
000000c: 008000 008000 008000 008000  ............
0000018: 0000ff 0000ff 0000ff 0000ff  ............
0000024: ff0000 ff0000 ff0000 ff0000  ............
0000030: 008000 008000 008000 008000  ............
000003c: 0000ff 0000ff 0000ff 0000ff  ............
0000048: ff0000 ff0000 ff0000 ff0000  ............
0000054: 008000 008000 008000 008000  ............
0000060: 0000ff 0000ff 0000ff 0000ff  ............
000006c: ff0000 ff0000 ff0000 ff0000  ............
0000078: 008000 008000 008000 008000  ............
0000084: 0000ff 0000ff 0000ff 0000ff  ............

希望你能看到第一行是4个红色像素,第二行是4个绿色像素...
简而言之,如果你想从图像中将纯二进制数据读入C程序,你可以这样做:
convert YourImage.jpg -depth 8 RGB:- | YourProgram

转换您的图片.jpg -depth 8 txt:-,谢谢,这正是我想要的。 - SHRIN
但是!不幸的是它非常非常慢。 - SHRIN
哦,那很容易。等几分钟。 - Mark Setchell
我添加了一些更多的选项 - 再看看并告诉我你的进展如何。 - Mark Setchell
感谢进一步选项。我还有另一个原因想了解像素颜色。不仅仅是为了了解单色图像,也是为了进行其他图像处理。 - SHRIN
显示剩余2条评论

8

ImageMagick有一个更新的选项,非常快速。它类似于txt:,但将数据列为逗号分隔的三元组(x,y,color,其中颜色是颜色名称或rgb(rr,gg,bb))。使用Mark的红、绿、蓝图像:

time convert WM9qM.gif sparse-color:

0,0,red 1,0,red 2,0,red 3,0,red 4,0,red 5,0,red 6,0,red 7,0,red 8,0,red 9,0,red 10,0,red 11,0,red 12,0,red 13,0,red 14,0,red 15,0,red 16,0,red 17,0,red 18,0,red 19,0,red 20,0,red 21,0,red 22,0,red 23,0,red 24,0,red 25,0,red 26,0,red 27,0,red 28,0,red 29,0,red 30,0,red 31,0,red 32,0,green 33,0,green 34,0,green 35,0,green 36,0,green 37,0,green 38,0,green 39,0,green 40,0,green 41,0,green 42,0,green 43,0,green 44,0,green 45,0,green 46,0,green 47,0,green 48,0,green 49,0,green 50,0,green 51,0,green 52,0,green 53,0,green 54,0,green 55,0,green 56,0,green 57,0,green 58,0,green 59,0,green 60,0,green 61,0,green 62,0,green 63,0,green 64,0,blue 65,0,blue 66,0,blue 67,0,blue 68,0,blue 69,0,blue 70,0,blue 71,0,blue 72,0,blue 73,0,blue 74,0,blue 75,0,blue 76,0,blue 77,0,blue 78,0,blue 79,0,blue 80,0,blue 81,0,blue 82,0,blue 83,0,blue 84,0,blue 85,0,blue 86,0,blue 87,0,blue 88,0,blue 89,0,blue 90,0,blue 91,0,blue 92,0,blue 93,0,blue 94,0,blue 95,0,blue 0,1,red 1,1,red 2,1,red 3,1,red 4,1,red 5,1,red 6,1,red 7,1,red 8,1,red 9,1,red 10,1,red 11,1,red 12,1,red 13,1,red 14,1,red 15,1,red 16,1,red 17,1,red 18,1,red 19,1,red 20,1,red 21,1,red 22,1,red 23,1,red 24,1,red 25,1,red 26,1,red 27,1,red 28,1,red 29,1,red 30,1,red 31,1,red 32,1,green 33,1,green 34,1,green 35,1,green 36,1,green 37,1,green 38,1,green 39,1,green 40,1,green 41,1,green 42,1,green 43,1,green 44,1,green 45,1,green 46,1,green 47,1,green 48,1,green 49,1,green 50,1,green 51,1,green 52,1,green 53,1,green 54,1,green 55,1,green 56,1,green 57,1,green 58,1,green 59,1,green 60,1,green 61,1,green 62,1,green 63,1,green 64,1,blue 65,1,blue 66,1,blue 67,1,blue 68,1,blue 69,1,blue 70,1,blue 71,1,blue 72,1,blue 73,1,blue 74,1,blue 75,1,blue 76,1,blue 77,1,blue 78,1,blue 79,1,blue 80,1,blue 81,1,blue 82,1,blue 83,1,blue 84,1,blue 85,1,blue 86,1,blue 87,1,blue 88,1,blue 89,1,blue 90,1,blue 91,1,blue 92,1,blue 93,1,blue 94,1,blue 95,1,blue 0,2,red 1,2,red 2,2,red 3,2,red 4,2,red 5,2,red 6,2,red 7,2,red 8,2,red 9,2,red 10,2,red 11,2,red ....

real    0m0.035s
user    0m0.024s
sys 0m0.007s

如果您想每个像素一行,可以执行以下操作:

convert WM9qM.gif sparse-color: | tr " " "\n"

0,0,red
1,0,red
2,0,red
3,0,red
4,0,red
5,0,red
6,0,red
7,0,red
8,0,red
9,0,red
10,0,red
11,0,red
12,0,red
13,0,red
14,0,red
15,0,red
16,0,red
17,0,red
18,0,red
19,0,red
20,0,red
21,0,red
22,0,red
23,0,red
24,0,red
25,0,red
26,0,red
27,0,red
28,0,red
29,0,red
30,0,red
31,0,red
32,0,green

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