<<

#264 ; Venĝemaj inĝenieraj fantomoj promenados ĉe lageto

>>

Jen vi vidas foton de greka teatro apud lageto en Pori, urboparto Vähärauma. Restis ankoraŭ iom da glacio en la surfaco de lageto.

Mi vivas en Tekunkorpi kaj trans la lageto estas eksa inĝeniera lernejo (sed nuna Winnova, kion ajn tio praktike signifu?). Tie multaj generacioj da inĝenieroj antaŭe provis (vane?) plibonigi sian profesian scipovon. Fariĝi inĝeniero estas ja granda evento.

Nu, fakte origine inĝenieroj konstruis balistoj, grandaj ĵetaj maŝinoj kaj aliaj militistaj konstruaĵoj multaj centoj da jaroj antaŭe. Poste oni bezonis civilaj inĝenieroj por konstrui stratoj, kloakoj, akvotubaroj kaj aliaj pacemaj strukturoj en pli grandaj urboj. Certe la industria revolucio multe prilaboris nian komprenon pri tio kion fakte signifas la vorto "inĝeniero". Ĉiuokaze, fariĝi inĝeniero kredeble estas revo por multaj knaboj.

Estis ankaŭ mia lernejo. Mi certe estas nekontenta pri la edukado kaj pri la labora vivo en Finnlando.

Mi estas certa ke tie apud la lageto vagadas aroj da fantomoj de mortintaj inĝenieroj por protesti kontraŭ la malbona edukada sistemo de Finnlando. Ion belan tagon mi ilian grupon aniĝos.

Kion ni tamen senpere povas tuj fari, jes, ni povas desegni koloran distingilon por nia eterna inĝeniera protesto kontraŭ malbona edukado.

Mi volas ke nia distingilo iom similas al svastiko kaj mi volas produkti ĝin per OpenCV kaj Raspberry Pi -mikrokomputilo. Jen iom da Python programo, unue ni nur legu la originan foton al memoro kiel img1 :

from matplotlib import pyplot as plt
import numpy as np
import cv2                  # OpenCV

img1 = cv2.imread('/home/pi/Kuvat/hail400.jpg')       # La origina foto

Sekve ni aparte desegnos la belan koloran distingilon img2 per la sekvanta programo, sed OpenCV opinias ke koloroj estas unue en ordo BGR.

Unue ni kreu novan "tute malplenan" nigran bildon en grando 300 punktoj * 300 punktoj kaj 3 koloroj en la programo kiel subaĵo por desegni.

img2 = np.zeros((300,300,3), np.uint8)         # 300x300 nigra kolora bildo

# Unuaj linioj sen OpenCV
img2[ 50:120, 146:154] = (  0,255,  0)
img2[ 50: 58, 150:200] = (255,255,  0)

# Sekve oblikvaj linioj kun OpenCV
img2 = cv2.line(img2, (172,172), (230,230), (  0,255,255), 8)
img2 = cv2.line(img2, (230,230), (190,270), (255,255,255), 8)

img2 = cv2.line(img2, (128,172), ( 80,230), (  0,  0,255), 8)
img2 = cv2.line(img2, ( 80,230), ( 40,190), (255,  0,255), 8)

# Cirkloj per OpenCV
img2 = cv2.circle(img2, (150,150), 30, (255,  0,  0), 8)
img2 = cv2.circle(img2, (150,150), 34, (255, 64, 64), 2)
img2 = cv2.circle(img2, (150,150), 26, (255, 64, 64), 2)

plt.imshow(img2)
plt.show()

Jen dekstre la preta desegnaĵo. Ni komencis el tute nigra "malplena" kolora bildo. Origine ĉiuj punktoj de bildo estis nuloj, BGR-koloroj de unu punkto (0, 0, 0), do nenia koloro por la punkto, nur nigra, tuta manko de koloro, tuta manko de lumo. Por la programo koloro estas la sama kiel lumo. Blanka koloro; ĉiuj koloroj, kiel eble plej multe da lumo. Nigra koloro, nenia lumo, neniom da koloroj.

Eblas bone desegni linioj per OpenCV kun cv2.line() kiam ni donas la koordinatojn de starta kaj fina punkto, la koloron de punktoj kaj la dikecon de linio, sed la unuaj linioj ni desegnis simple tiel ke ni rekte lokigis koloroj (B, G, R) en la tabelo kiu konsistigas la bildon, laŭ opinio de programo. Horizontalaj kaj vertikalaj linioj eblas facile desegni tiel. Oblikvaj linioj tamen estas pli malfacilaj kaj por ili ni prefere uzu la pretajn funkciojn de OpenCV.

Oni povus eble imagi ke la distingilo prezentas pasantan homon, aŭ eĉ fantomon, fantomon de malkontenta inĝeniero? Mi tamen plejparte nur volis eksperimenti per kelkaj fortaj koloroj.

Sekve ni produktu la parton de fonon de bildo tiel ke la loko de kolora distingilo estas tute nigra:

rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]

# Masko kaj renversita masko por la distingilo
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

# La parto de origina foto tiel ke loko de distingilo estos nigra
img1_bg = cv2.bitwise_and(roi, roi, mask = mask_inv)
plt.imshow(img1_bg)
plt.show()

Jes, nun la loko de distingilo estas tute nigra.

Fine ni produktu la kombinitan bildon. Ni memoru ke

Oni povus ankaŭ diri ke

La koloroj aperas iom aliaj en la apuda bildo. Malnova vere iom ruĝa RGB herbo aperas blua en BGR koloroj. Blua RGB ĉielo aperas iom ruĝa en BGR koloroj. Verda koloro tamen restas proksimume la sama. Verda "G" ja estas en centro en ambaŭ koloraj sistemoj BGR kaj RGB.

Ni volas kombini du bildoj. Bildo de distingilo estas plejparte nigra. Ni uzas varion de origina bildo kie nur la lokoj de gravaj partoj de distingilo estas tute nigraj. Kune ili konsistigos nian finan produkton.

# La distingilo
img2_fg = cv2.bitwise_and(img2, img2, mask = mask)

# Unuigi la fonon kaj distingilon per prudenta sumo
dst = cv2.add(img1_bg, img2_fg)

img1[0:rows, 0:cols] = dst

# aliaj koloroj BGR -> RGB por matplotlib
b,g,r = cv2.split(img1)
img1 = cv2.merge((r,g,b))

plt.imshow(img1)
plt.show()

Jen la preta kombinita bildo, nia eksa lernejo kun nia distingilo en RGB -koloroj kiojn la funkcioj de matplotlib preferas. Nur la koloraj partoj de desegnaĵo kovras la originan foton. La kolora parto de distingilo tute ne estas travidebla, sed oni povas vidi la lernejon ekzemple tra la "truo". Eble vi volas kompari al la pli simplaj rezultoj en artikolo #261.

Povas ja esti suprize ke nigra koloro ne kovras aliajn kolorojn. Oni tamen memoru ke en komputilaj programoj nigra signifas nur nulon. NIGRA ESTAS NENIO! Nigra do tute ne aliigas kolorojn kiam oni sumas bildojn. Estas ja neniom da lumo en nigra. Oni sumas nur kvanton de LUMO en programo.

Ekzemple kun veraj akvofarboj estas la situacio ja tute alia. Se vi kolorigas bele koloran pentraĵon per forta nigra peniko, estos la rezulto fie malbela. Vera nigra farbo kovras la antaŭajn kolorojn per nigra koloro. Se mi bone memoras, per akvofarboj oni ricevis verdan resulton kiam oni miksis flavan kaj bluan koloron. En nia programo ni ricevis (en BGR) flavan kiel rezulto kiam ni miksis bluan kaj verdan lumon. Kaj ni ricevis (en RGB) helan bluan en programo kiam ni miksis ruĝan kaj verdan lumon. Mirinda mondo de koloroj.

Estas interese kiel la videblaj koloroj aliiĝas en sistemoj BGR <-> RGB. Koloroj nigra (0, 0, 0), blanka (255, 255, 255) kaj verda (0, 255, 0) estas la samaj en ambaŭ direktoj. Ankaŭ la koloro (255, 0, 255) aperas la sama viola koloro sendepende ĉu la kolora sistemo estas BGR aŭ RGB.

En ĉi tiu simpla kazo ni povus atingi la saman finan rezulton tiel ke ni simple desegnu la distingilan simbolon rekte sur la origina foto en la programo. La simbolo ja estas tre simpla kaj rapida por desegni. Tamen ĝi povus esti multe pli kompleksa kaj preskaŭ senebla - aŭ tro malrapida - por desegni per ĉi tia simpla metodo. Mi kredas ke oni evoluigis ĉi tiun metodon por rapide prilabori unuopaj "framoj" de filmo. Certe estus tro malrapide por aparte desegni komplikan distingilon por ĉiuj framoj de filmo. Kredeble povas esti en filmo ekzemple 24 da unuopaj framoj (unuopaj fotoj) per unu sekundo kaj oni bezonas fortan metodon por ilin prilabori.

Ĉiuokaze longe vivu bona inĝeniera arto!

Kaj certe fine .......... NI VENKOS!

La Ambasadoro en Pori
de sendependa nacio
Mueleja Insulo


Menuo
Ĉefa paĝo (finna lingvo)