【问题标题】:Python Draw a line with gradient where one color is transparentPython用渐变绘制一条线,其中一种颜色是透明的
【发布时间】:2018-03-31 04:16:49
【问题描述】:

我搜索了 OpenCV、matplotlib、颜色图和其他关于在透明图像上绘图的帖子。我还没有找到一种方法来绘制一条具有从一种颜色到透明颜色的渐变的线条。

例如,这张图片与我的意思很接近,但是黑色部分不透明。我需要两条线,没有交叉点周围的框。

是否有可以处理像这样具有完全透明颜色的渐变的包?我一直在使用 Python 3 和 OpenCV 3,但是,任何其他可以做到这一点的包都可以。谢谢。

【问题讨论】:

  • 你是怎么画这些线的?还是您只想单独删除此图片的框?
  • 这只是画在一个办公包里,试图代表我想做的事情。

标签: python image opencv matplotlib


【解决方案1】:

听起来您正在寻找一些 alpha 混合。

# Define line params
x = img.shape[1] // 2
w = 10

# Construct line
line = np.zeros_like(img)
line[:, (x-w):(x+w+1)] = (0, 255, 255)

# Construct line alpha mask
alpha = np.zeros_like(img, np.float32)
alpha[:, (x-w):x, :]   = np.repeat(np.arange(1, w+1    )[:, np.newaxis] / (w+1), 3, axis=1)
alpha[:, x:(x+w+1), :] = np.repeat(np.arange(w+1, 0, -1)[:, np.newaxis] / (w+1), 3, axis=1)

# Blend into img
img = ((1-alpha) * img + alpha * line).astype(img.dtype)

【讨论】:

  • 好的,这给了我一条我需要的垂直线!现在,我唯一的问题是,如果我有几条线相互交叉,它们会“重叠”而不相互扭曲吗?我对线条的交点感兴趣。
  • 什么是“失真”?您在寻找哪种混合方式? (overlay,additive,...) 在这种情况下,alpha 值为 1 意味着 100% 的线被采用。
  • 失真可能是错误的词。我希望它们覆盖两条可见的部分透明部分(意味着没有一条线完全阻挡另一条线)
  • 这就是……视觉上的。尽管您必须更准确地了解您想要什么(对于什么应用程序?)。例如,0.2 * 0.8 + 0.8 * 1 = 0.96。保留了一些“透明度”。
  • 在 OpenCV 中,我的线从一个点到另一个点(使用标准 x,y 坐标)。有没有一种快速的方法可以将其转换为 numpy 数组?你写这个的方式直接改变了数组元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
相关资源
最近更新 更多