【问题标题】:Matlab imtransform with transparency具有透明度的Matlab imtransform
【发布时间】:2017-01-24 20:55:51
【问题描述】:

我正在使用 Matlab 函数 imtransform 来扭曲具有保形贴图的 RGB 图像(示例 https://www.flickr.com/photos/gbachelier/albums/72157677436918822)。

在这些图像中是填充有“FillValues”的空白区域(在示例图像中,0 = 黑色)可能是未定义地图。我想直接用透明度填充这些区域以进行额外的复合操作,因为如果我将在 imtransform 后将所有黑色像素传输为透明 (Make a pixel transparent in Matlab),这可能会影响其他区域。知道如何在不影响其他区域的情况下使这些区域透明吗?非常感谢你!

【问题讨论】:

  • 为什么选择该区域并将其视为透明是一个问题?似乎是一种足够简单的方法
  • @Tasos Papastylianou:如果您的意思是“手动选择”,那是不可能的。我需要算法方法,因为这是进化艺术过程的一部分,人口 >= 10^3 个人。
  • 不,不是手动的,该页面上的所有示例都涉及全黑像素的中心连接组件,大概是您想要使其透明。选择那个中心连接的组件(例如,通过bwconn / bwlabel)并通过算法对这些像素做任何你想做的事情。
  • 更不用说,所有这些示例的中心组件似乎都处于完全相同的位置和大小。只需应用预定义的蒙版即可。

标签: matlab image-processing


【解决方案1】:

您可以使用白色图像,所有值都是 255,并对其应用相同的转换并将结果用作透明度的蒙版。

使用公式(您在 cmets 中注明)可以合成两个图像。

例子:

I1=double(imread('klXfF.jpg'));
I2=double(imread('9cEgo.jpg'));
G=double(imread('xHOtx.jpg'))/255;
I3 = uint8(bsxfun(@times, 1-G, I1 ) + bsxfun(@times, G, I2));
%In MATLAB R2016b this notation can be used
%  I3 = uint8((1-G) .* I1 + G .* I2);
imwrite(I3, "result.jpg");

【讨论】:

  • 是的,如果这是 Perlmagick 中的一项任务,那将是我会选择的策略,但我在 Matlab 中还没有那么丰富的经验。除了生成灰色蒙版之外,还需要将具有 CopyOpacity 的复合功能移植到 Matlab。直接填充 imtransform 将是一种更容易的方法,但如果这不可能,我必须在 Matlab 中查看掩码和合成。
  • 我按照你的建议做了一个灰色蒙版(通过一些模糊后处理来柔化边缘以避免锯齿效果;针对复制不透明度等合成操作进行了优化):flickr.com/photos/gbachelier/32536660495/in/… 你能给我提示如何在 Matlab 中实际进行合成操作,以通过将灰度值软过渡到不透明白色来掩盖黑色区域。谢谢!
  • 合成是什么意思。你能提供一个最小的例子吗?例如一个 10 * 20 的图像作为输入和预期的输出
  • 我的意思是 Alpha 合成 (RGBa) 是将蒙版的灰度值 [0 ... 255] 映射到 [0 1/255 ... 254/255 1] 并用于阿尔法层。另一方面,可以跳过这个中间步骤,直接将带有灰度掩码 G 的图像 I1 和 I2 合成为像素值的加权和:I3(i,j) = (1 - G(i,j)/255) * I1(i,j) + G(i,j) * I2(i,j) 类似于de.mathworks.com/help/vision/ref/compositing.html(没有视觉工具箱)。为了避免 for 循环,也许可以直接将其表述为 I3 = (1-G/255) * I1 + G/255 * I2。
  • @rahnema1:矢量化公式 I3 = uint8((1-G) .* I1 + G .* I2);正是我想要的。非常感谢!!
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 2011-07-05
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2014-07-28
  • 2011-04-09
相关资源
最近更新 更多