【问题标题】:Opacity from RGB arrayRGB 阵列的不透明度
【发布时间】:2017-04-02 16:39:05
【问题描述】:

所以我不是编码专家:我只是对一些零碎的东西有一个模糊的了解。

我知道像素尺寸 X*Y 的图像存储在大小为 3*X*Y 的数组中,其中从给定 (x,y) 值中提取的每个向量对于 3 个 RGB 值具有 3 个元素。

我还知道,也可以将图像存储在 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 图像。

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


示例:参考 = {250 251 245}

RGB 数组 =

|{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}|

【问题讨论】:

  • 您似乎掌握了所涉及的数学知识,有什么问题吗?这不是代码编写服务。
  • 不,我不知道,只是我不知道如何实际实现它。我只在 Matlab 中完成了编码的基础知识,所以我完全不知所措。
  • 听上去很有趣……来点样张图片怎么样?

标签: arrays image image-processing colors


【解决方案1】:

您可以非常简单地执行此操作,只需在命令行中使用 ImageMagick,它安装在大多数 Linux 发行版上,并且在 OSX 和 Windows 上免费提供。

“秘方”-fx 运算符 - 描述为 here

所以,让我们生成一个 300x200 的黑色图像,然后使用-fx 计算红色通道,以便红色根据我们从左侧(@ 987654331@):

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

请注意,我正在生成带有-size 300x200 xc:black 的图像“on-the-fly”,而如果您有一个带有动画帧的PNG 文件,您可以将其放入它的位置。

现在假设我们也想改变不透明度/alpha - 根据图像到顶部的距离:

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

好的,我们到了...你的函数有点复杂,所以,我们可以把它放在一个名为RGB2Opacity.fx的脚本文件中,而不是每次都在命令行中输入:

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

RGB2Opacity.fx 很简单,目前看起来像这样:

0.2

现在我们需要将您的 "reference" 像素与您的动画帧一起放在命令行上,以便 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)

我不知道是否/如何将 cmets 放入 -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

并检查它是否正确:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 2021-05-07
    • 2012-05-10
    • 2019-11-26
    • 2014-01-05
    • 2020-07-12
    • 2015-05-05
    相关资源
    最近更新 更多