将线性透明渐变应用于python中具有透明背景的图像部分
Posted
技术标签:
【中文标题】将线性透明渐变应用于python中具有透明背景的图像部分【英文标题】:Apply linear transparent gradient to a portion of image with transparent background in python 【发布时间】:2021-12-30 17:14:53 【问题描述】:我只需要将线性透明渐变应用到图像的底部 5%。我有一些想法,首先我需要在 Alpha 通道上创建蒙版。但我不确定我该怎么做,这只会影响图像的底部 5%。到目前为止,我已经尝试了不同的方法,但没有运气。渐变应该从图像的 5% 高度开始,100% alpha 和 0% alpha 结束。此外,图像可以是具有透明背景的非矩形 PNG。我真的很感激任何帮助。谢谢你。 Here 是我需要的一个例子。但它可以是矩形或非矩形图像。
【问题讨论】:
如果渐变是透明的,就不会显示。你想做什么?你能举一个输入和输出的例子吗?你试过什么?你在 OpenCV 中需要这个还是 Python Wand 可以?你需要更清楚一点。请阅读本论坛的帮助部分,了解如何提出好问题以及如何提供可测试的代码。 您是在问如何使图像的底部褪色到完全透明?或者可能会变成灰色? 查看 np.linspace() at numpy.org/doc/stable/reference/generated/numpy.linspace.html 以创建线性渐变 嗨@fmw42 我已经编辑并添加了一个示例。请检查一下。图像的底部应渐变为完全透明。谢谢 任何图书馆都可以。 opencv、imagemagic 或其他任何可以通过 bash 终端调用的东西 【参考方案1】:这是在 Python/OpenCV/Numpy 中针对不透明图像执行此操作的一种方法。
- Read the input
- Compute top and bottom heights for the alpha channel
- Create a constant white image for top
- Create a vertical gradient going from 255 to 0 for the bottom
- Stack the top and bottom parts
- Convert the image to 4 channels BGRA
- Replace the alpha in the BGRA image with the stacked alpha
- Save the result
输入:
import cv2
import numpy as np
# read image
img = cv2.imread("lena.png")
ht, wd = img.shape[:2]
# compute 5% of ht and 95% of ht
# pct = 5
pct = 25 # temparily set pct to 25 percent for demonstration
ht2 = int(ht*pct/100)
ht3 = ht - ht2
# create opaque white image for top
top = np.full((ht3,wd), 255, dtype=np.uint8)
# create vertical gradient for bottom
btm = np.linspace(255, 0, ht2, endpoint=True, dtype=np.uint8)
btm = np.tile(btm, (wd,1))
btm = np.transpose(btm)
# stack top and bottom
alpha = np.vstack((top,btm))
# put alpha channel into image
result = img.copy()
result = cv2.cvtColor(result, cv2.COLOR_BGR2BGRA)
result[:,:,3] = alpha
# save result
cv2.imwrite('lena_fade.png', result)
# display results
# (note: display does not show transparency)
cv2.imshow('btm', btm)
cv2.imshow('alpha', alpha)
cv2.imshow('result', result)
cv2.waitKey(0)
结果:
添加
这里是如何在 ImageMagick 7 中做到这一点。
magick lena.png \
-set option:wd "%w" \
-set option:ht "%h" \
-set option:ht2 "%[fx:round(25*ht/100)]" \
-set option:ht3 "%[fx:ht-ht2]" \
\( -size "%[wd]x%[ht3]" xc:white \) \
\( -size "%[wd]x%[ht2]" gradient:white-black \) \
\( -clone 1,2 -append \) \
-delete 1,2 \
-alpha off -compose copy_opacity -composite \
lena_fade2.png
结果图像:
【讨论】:
感谢您的帮助。但它仅适用于矩形图像。但不适用于非矩形图像。我的意思是我需要在具有透明背景的图像上应用它。您的代码将黑色背景添加到图像。谢谢 我发布了另一个答案,它对是否具有透明度的图像进行淡化处理。【参考方案2】:如果您在输入中是否有现有的 Alpha 通道,以下是如何在 ImageMagick 7 中执行此操作。略有不同。您基本上从输入中提取 alpha 通道并将其与包含渐变的通道相乘。然后将新的图像放入原始图像中,替换现有的 Alpha 通道。
输入:
magick lena_circle.png \
-alpha set \
-set option:wd "%w" \
-set option:ht "%h" \
-set option:ht2 "%[fx:round(0.25*ht)]" \
-set option:ht3 "%[fx:ht-ht2]" \
\( -size "%[wd]x%[ht3]" xc:white \) \
\( -size "%[wd]x%[ht2]" gradient:white-black \) \
\( -clone 1,2 -append \) \
-delete 1,2 \
\( -clone 0 -alpha extract \) \
\( -clone 1,2 -compose multiply -composite \) \
-delete 1,2 \
-alpha off -compose copy_opacity -composite \
lena_circle_fade3.png
结果图像:
【讨论】:
以上是关于将线性透明渐变应用于python中具有透明背景的图像部分的主要内容,如果未能解决你的问题,请参考以下文章