RGB数组

时间:2016-11-18 18:20:52

标签: arrays image image-processing colors

所以我不是编码方面的专家:我只是对一点点和一点点的模糊理解。

我理解像素尺寸X * Y的图像存储在大小为3 * X * Y的数组中,其中从给定(x,y)值拉出的每个矢量具有3个RGB元素值的元素。

我也明白,人们还可以将图像存储在4 * X * Y阵列中,其中每个拉出的矢量现在有4个值,RGBA,A为Alpha,用于表示特定像素的不透明度。

现在我进入动画,并在黑色背景上绘制了白云的铅笔画,我想将其导入Flash。我希望图纸的黑色部分更透明,更轻的部分更不透明。我扫描了以.png格式保存的图纸。

如果我知道如何在阵列级别操作图像,我可以自己捅一下,但我不知所措。

我需要一个程序,在给定.png图像和参考RGB值{abc}的情况下,获取图像的RGB数组并将其转换为RBGA数组 ,以便:

RGB值{p q r}

的像素

......变得......

RGBA值的像素{p q r 1-M [(| p-a | ^ 2 + | q-b | ^ 2 + | r-c | ^ 2)^ 1/2]}。

其中M是使最大alpha值= 1的归一化因子。

即。 M = 1 / [(255 ^ 2 + 255 ^ 2 + 255 ^ 2)^ 1/2])= 0.0026411 ...

即。替换像素的alpha值是'距离'在像素的颜色和可以输入的一些参考颜色之间。

然后需要将新的RGBA数组导出为png图像。

任何想法或任何动画师都知道这是否可以直接用动作来完成?

示例:参考= {250 251 245}

RGB array =

| {250 251 245} {250 250 250} |

| {30 255 22} {234 250 0} |

......变得......

RGBA数组=

| {250 251 245 1} {250 251 245 0.987} |

| {30 255 22 0.173} {234 250 0 0.352} |

1 个答案:

答案 0 :(得分:0)

您只需在命令行中使用 ImageMagick 即可完成此操作,该驱动程序安装在大多数Linux发行版上,可在OSX和Windows上免费使用。

"秘密酱#34; -fx运算符 - 描述为here

因此,让我们生成一个300x200的黑色图像,然后使用-fx来计算红色通道,以便红色根据宽度的一小部分(w)在整个图像中变化我们来自左侧(i):

convert -size 300x200 xc:black -channel R -fx 'i/w'  result.png

enter image description here

请注意,我正在使用-size 300x200 xc:black生成图像"动态" ,而如果您的动画帧中包含PNG文件,你可以把它放在它的位置。

现在让我们说我们想要改变不透明度/ alpha - 根据图像从顶部的距离:

 convert -size 300x200 xc:black -alpha on \
    -channel R -fx 'i/w'                  \
    -channel A -fx 'j/h' result.png

enter image description here

好的,我们到了那里......你的功能有点复杂,所以,不是每次都在命令行输入它,我们可以将它放在一个名为RGB2Opacity.fx的脚本文件中,就像这样:

convert -size 300x200 xc:black -alpha on -channel A -fx @RGB2Opacity.fx result.png

其中RGB2Opacity.fx很简单,暂时看起来像这样:

0.2

现在我们需要在动画帧的命令行上放置"引用" 像素,以便 ImageMagick 可以解决差异。这意味着您的实际命令行看起来或多或少与以下内容完全相同:

convert -size 300x200 xc:"rgb(250,251,245)" YourImage.png -alpha on -channel A -fx @RGB2Opacity.fx result.png

然后我们需要在-fx脚本文件中实现您的公式。您的变量名称必须至少为2个字母且没有数字,并且您应该为不透明度返回单个值。变量都在[0,1.0]之间缩放,所以你的255缩放有点不同。我没有样本图像,我不确定答案应该如何看,但它将非常接近这个:

MM=1/pow(3,0.5);
pmasq=pow((u.r-v.r),2.0);
qmbsq=pow((u.g-v.g),2.0);
rmcsq=pow((u.b-v.b),2.0);
1-MM*pow((pmasq+qmbsq+rmcsq),0.5)

我不知道是否/如何在-fx脚本中添加评论,因此我将在下面解释变量名称:

  • pmasqp减去a的平方。

  • qmbsqq减去b的平方。

  • rmcsqr减去c的平方。

  • u.r是指 ImageMagick 列表中第一个图片的红色频道,即您参考的红色频道像素。

  • v.g是指 ImageMagick 列表中第二图像的绿色通道,即动画的绿色通道帧。

现在让我们创建你的动画帧:

convert xc:"rgb(250,251,245)" xc:"rgb(250,250,250)" xc:"rgb(30,255,22)" xc:"rgb(234,250,0)" +append frame.png

enter image description here

并检查它看起来是否正确:

convert frame.png txt:

<强>输出

# ImageMagick pixel enumeration: 4,1,65535,srgb
0,0: (64250,64507,62965)  #FAFBF5  srgb(250,251,245)
1,0: (64250,64250,64250)  #FAFAFA  grey98
2,0: (7710,65535,5654)  #1EFF16  srgb(30,255,22)
3,0: (60138,64250,0)  #EAFA00  srgb(234,250,0)

如果我们将这个应用到您的图片并检查结果,您可以看到我在某个地方稍微有点错误,但我会留下您(或其他一些明亮的火花)来解决这个问题...

convert -size 4x1 xc:"rgb(250,251,245)" frame.png -alpha on -channel A -fx @RGB2Opacity.fx result.png

convert result.png txt:

# ImageMagick pixel enumeration: 4,1,65535,srgba
0,0: (64250,64507,62965,65535)  #FAFBF5FF  srgba(250,251,245,1)
1,0: (64250,64507,62965,64764)  #FAFBF5FC  srgba(250,251,245,0.988235)
2,0: (64250,64507,62965,19018)  #FAFBF54A  srgba(250,251,245,0.290196)
3,0: (64250,64507,62965,29041)  #FAFBF571  srgba(250,251,245,0.443137)