Sloučení obrázků do jednoho – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Sloučení obrázků do jednoho – Python – Fórum – Programujte.comSloučení obrázků do jednoho – Python – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Lolo240
Newbie
20. 1. 2021   #1
-
0
-

Dobrý den, jak prosím sloučit obrázky (i ze souboru) do jednoho a malovat přes ně? Děkuji

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import imageio
from bokeh.plotting import figure, output_file, show 
import os                                               
from matplotlib.colors import LinearSegmentedColormap
from scipy import ndimage
import matplotlib.image as mpimg

# Plot figure with size
fig, ax = plt.subplots()

i = 320
my_map = Basemap(projection='ortho', lat_0=0, lon_0=i, resolution='l', area_thresh=1000.0)
my_map.bluemarble()
my_map.etopo()

plt.savefig('Earth.png')


# Consolidation with the help of mpimg
fig, ax = plt.subplots(figsize=(10,5))

img = mpimg.imread('Earth.png')
imgplot = plt.imshow(img)


# Fuzzy annulus - applying a gaussian blur
rad1, rad2 = 70, 95
rad_max = 120 
x = np.linspace(-rad_max, rad_max, 500)
y = np.linspace(-rad_max, rad_max, 500)
r = np.sqrt(x[:, np.newaxis] ** 2 + y[np.newaxis, :] ** 2)
img = np.array((r > rad1) & (r < rad2), dtype=float)
img = ndimage.gaussian_filter(img, sigma=20, mode='nearest')
cmap = LinearSegmentedColormap.from_list('', ['white', 'steelblue'])
plt.imshow(img, extent=[-rad_max, rad_max, -rad_max, rad_max], cmap=cmap)
plt.show()

os.remove("Earth.png")
Nahlásit jako SPAM
IP: 2a00:1028:9197:cbb6:d50c:5d88:518a:5810...–
gna
~ Anonymní uživatel
1891 příspěvků
20. 1. 2021   #2
-
+1
-
Zajímavé

Co myslíš sloučením obrázků?

Nahlásit jako SPAM
IP: 213.211.51.–
Lolo240
Newbie
20. 1. 2021   #3
-
0
-

#2 gna
Mít několik obrázků a všechny dát s nějakým umístěním do jednoho. V tom příkladu v otázce bych chtěl dát ten prstenec kolem Země a nalevo vložit další obrázek ze souboru, nebo něco namalovat pomocí matplotlibu.

Nahlásit jako SPAM
IP: 2a00:1028:9197:cbb6:d50c:5d88:518a:5810...–
gna
~ Anonymní uživatel
1891 příspěvků
20. 1. 2021   #4
-
+1
-
Zajímavé

S tím prstencem je problém v tom, že to není jen prstenec, ale čtverec. Takže do toho budeš muset nějak zakomponovat průhlednost. Nejednoduší je to "oříznout".

...
img = np.ma.masked_where(img < 0.2, img)
Nahlásit jako SPAM
IP: 213.211.51.–
Lolo240
Newbie
20. 1. 2021   #5
-
0
-

#4 gna

Děkuji za odpovědi a jak se uděká blend, aby se zohlednilo to odebrané pozadí? Výsledek kódu pod je překryv podkladu i když je odebrané pozadí. Také nevím, jak druhý z obrázků zvětšit, tj., obrázek Earth vložit do prstence.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import imageio
from bokeh.plotting import figure, output_file, show 
import os                                               # to remove the file
from matplotlib.colors import LinearSegmentedColormap
from scipy import ndimage
import matplotlib.image as mpimg
import operator
from PIL import Image
from PIL import ImageDraw


fig, ax = plt.subplots(figsize=(5,5))

i = 320
my_map = Basemap(projection='ortho', lat_0=0, lon_0=i, resolution='l', area_thresh=1000.0)
my_map.bluemarble()
my_map.etopo()

plt.savefig('Earth.png')


fig2, ax2 = plt.subplots(figsize=(5,5))
rad1, rad2 = 70, 95
rad_max = 120 
x = np.linspace(-rad_max, rad_max, 500)
y = np.linspace(-rad_max, rad_max, 500)
r = np.sqrt(x[:, np.newaxis] ** 2 + y[np.newaxis, :] ** 2)
img2 = np.array((r > rad1) & (r < rad2), dtype=float)
img2 = ndimage.gaussian_filter(img2, sigma=20, mode='nearest')
cmap = LinearSegmentedColormap.from_list('', ['white', 'steelblue'])
plt.imshow(img2, extent=[-rad_max, rad_max, -rad_max, rad_max], cmap=cmap)
img2 = np.ma.masked_where(img2 < 0.2, img2)
plt.imsave('annulus.png', img2, cmap=cmap)
plt.show()

# suppose img1 and img2 are your two images
img1 = Image.open('Earth.png')
img2 = Image.open('annulus.png')

# blend
result = Image.blend(img1, img2, alpha=1)
result.save('out.png', quality=95) 

#os.remove("Earth.png") 
#os.remove("annulus.png") 
Nahlásit jako SPAM
IP: 2a00:1028:9197:cbb6:d50c:5d88:518a:5810...–
gna
~ Anonymní uživatel
1891 příspěvků
20. 1. 2021   #6
-
+1
-
Zajímavé

Necheš pevnou alphu na celý obrazek, ale per-pixel alphu/masku z obrázku. Na další manipulace prolítni dokumentaci PIL.Image, těch funkcí tam není moc.

img1 = Image.open('Earth.png')
img2 = Image.open('annulus.png')

comp1 = Image.new('RGBA', (500, 500))
thumb = img1.copy()
thumb.thumbnail((200, 200))  # resize se zachovanim pomeru stran
pos = ((comp1.width - thumb.width) // 2, (comp1.height - thumb.height) // 2)
comp1.paste(thumb, pos)

comp2 = Image.new('RGBA', comp1.size)
thumb = img2.copy()
thumb.thumbnail((400, 400))
pos = ((comp2.width - thumb.width) // 2, (comp2.height - thumb.height) // 2)
comp2.paste(thumb, pos)

out = Image.alpha_composite(comp1, comp2)

comp1.show()
comp2.show()
out.show()
Nahlásit jako SPAM
IP: 213.211.51.–
Lolo240
Newbie
21. 1. 2021   #7
-
0
-

#6 gna
Moc děkuji a co je za chybu v tomhle, že se ve výstupu nezobrazuje text ani čára?

from PIL import Image
from PIL import ImageDraw

shift_x = 500
shift_y = 100

img1 = Image.open('Earth.png')
img2 = Image.open('annulus.png')

comp1 = Image.new('RGBA', (1000, 500), color = 'white') # create blank image for drawing
thumb = img1.copy()         
thumb.thumbnail((210, 210)) 
pos = ((comp1.width - thumb.width + shift_x) // 2, (comp1.height - thumb.height + shift_y) // 2) 
comp1.paste(thumb, pos) # paste image with position

comp2 = Image.new('RGBA', comp1.size)   # create blank image with the same size as the first one
thumb = img2.copy()
thumb.thumbnail((400, 400))
pos = ((comp2.width - thumb.width + shift_x) // 2, (comp2.height - thumb.height + shift_y) // 2)
comp2.paste(thumb, pos)

out = Image.alpha_composite(comp1, comp2)


# Drawing to the resulting figure
draw = ImageDraw.Draw(out)
draw.multiline_text((100, 100), 'Ionosphere')
draw.line((900, 1000, 500, 700), fill=(255, 0, 0), width=8) # [x1,x2,y1,y2]

out.save('out.png', quality=95) # 95 is the highest quality, 1 is the least quality 
Nahlásit jako SPAM
IP: 2a00:1028:9197:cbb6:d50c:5d88:518a:5810...–
gna
~ Anonymní uživatel
1891 příspěvků
21. 1. 2021   #8
-
+1
-
Zajímavé

Text je nejspíš bílý na bílém pozadí a čára je mimo obrázek :-D

Nahlásit jako SPAM
IP: 213.211.51.–
Lolo240
Newbie
21. 1. 2021   #9
-
0
-

#8 gna
Děkuji za pomoc

Nahlásit jako SPAM
IP: 2a00:1028:9197:cbb6:d50c:5d88:518a:5810...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

Slouceni — založil petrus

Sloučení tabulek — založil CZechB0Y

Slouceni souboru — založil petr

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý