Použít lineární transparentní přechod na část obrazu s průhledným pozadím v pythonu

0

Otázka

Já třeba použít lineární transparentní gradientu pouze spodní 5% obrazu. Mám nějakou představu, že nejdřív musím vytvořit masku v alfa kanálu. Ale nejsem si jistá, jak to zvládnu, která postihuje pouze dolní 5% obrazu. Zkoušel jsem různé metody, bud ne štěstí tak daleko. Přechod by měl začít v 5% výšky obrazu na 100%, alfa a 0% alfa na konci. Také obrazy mohou být non-obdélníkový PNG s průhledným pozadím. Já bych opravdu ocenil jakoukoliv pomoc. Děkuji. Zde je příklad toho, co potřebuji. Ale to může být buď obdélníkový nebo non-obdélníkový obraz.

cv2 image-processing imagemagick python
2021-11-20 04:04:58
2

Nejlepší odpověď

1

Zde je, jak to udělat, že v ImageMagick 7 pokud máte existující alfa kanál ve vstupním nebo ne. To je mírně odlišná. V podstatě extrakt alfa kanál ze vstupního a vynásobte to s jedním, obsahující gradient. Pak dát nový jeden do původního obrazu nahrazení stávajícího alfa kanálu.

Vstup:

enter image description here

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

Výsledný Obrázek:

enter image description here

2021-11-20 05:21:10
1

Zde je jeden způsob, jak to udělat v Pythonu/OpenCV/Numpy pro neprůhledné obrazy.

 - 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

Vstup:

enter image description here

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)

Výsledek:

enter image description here

KROMĚ

Zde je, jak to udělat, že v 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

Výsledný Obrázek:

enter image description here

2021-11-20 05:37:21

Děkujeme vám za vaši pomoc. Ale to funguje pro pravoúhlé pouze fotografie. Ale ne pro non-obdélníkový obraz. Myslím tím, že třeba aplikovat na obrázky s průhledným pozadím. Váš kód přidá černé pozadí obrazu. Děkuji
Z Dhillon

Jsem vyslán další odpověď, která dělá fade pro obrazy, které mají transparentnosti, nebo ne.
fmw42

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................