Kezdőoldal » Számítástechnika » Programozás » Szeretnék csinálni, egy olyan...

Marcivagyok599 kérdése:

Szeretnék csinálni, egy olyan programot python-ban, ami már a képkockákra szétbontott fekete-fehér videó pixeleit nullásokra és egyesekre bontja (0 = fekete 1 = fehér), de nem úgy mint egy átlagos ASCII videó, hanem minden pixel külön listában. ?

Figyelt kérdés

Nyílván, hogy gyorsabb legyen, le van butítva a videó felbontása. Próbáltam már az ASCII-t, de ez nem telljesen olyan lenne, vagy lehet, hogy igen. (Python e részéhez nem értek sajna) Úgy kéne, hogy minden pixelt egy külön listában tárolná el. Szóval minden pixelnek kéne, hogy legyen egy saját listája, ahol eltárolja, hogy az első képkockában még ez 0 volt a 2. ban 1, a 3. ban 1... ez így lenne minden pixellel.

pl:

1x1(ez a bal felső első pixel)[0(első képkocka) ,0(második képkocka) ,0(...) ,1,1,0,1,0,1,0...]

1x2(első sor második oszlop pixel)[0,1,0,0,0,1,0...]

1x3[1,0,1,0,0,0,0,1,0]

1x4...

2x1(ez a második sor első oszlop)...

2x2...


És miután kész van, kiprinteli az összes kész listát.


Letöltöttem egy célomra hasonló kódot, ami viszont nem úgy működik, mint akarom, de talán az alapjai megvannak.


Itt a kód:

import time

from PIL import Image


CLIP_FRAMES = 6571


CLIP_LENGTH = 219.0666


ASCII_CHARS = ['0','0','0','0','0','0','1','1','1','1','1']

ASCII_CHARS.reverse()

ASCII_CHARS = ASCII_CHARS[::-1]


WIDTH = 40


TIMEOUT = 1/((int(CLIP_FRAMES/4)+1)/CLIP_LENGTH)*18


def resize(image, new_width=WIDTH):

(old_width, old_height) = image.size

aspect_ratio = float(old_height)/float(old_width)

new_height = int((aspect_ratio * new_width)/2)

new_dim = (new_width, new_height)

new_image = image.resize(new_dim)

return new_image


def grayscalify(image):

return image.convert('L')


def modify(image, buckets=25):

initial_pixels = list(image.getdata())

new_pixels = [ASCII_CHARS[pixel_value//buckets] for pixel_value in initial_pixels]

return ''.join(new_pixels)


def do(image, new_width=WIDTH):

image = resize(image)

image = grayscalify(image)


pixels = modify(image)

len_pixels = len(pixels)


new_image = [pixels[index:index+int(new_width)] for index in range(0, len_pixels, int(new_width))]

return '\n'.join(new_image)


def runner(path):

image = None

try:

image = Image.open(path)

except Exception:

print("Unable to find image in",path)

return

image = do(image)


return image


frames = []

pix1 = ""


for i in range(0, int(CLIP_FRAMES/4)+1):

path = "frames/frame"+str(i*4)+".jpg"

frames.append(runner(path))



oldTimestamp = time.time()


start = oldTimestamp


seconds = 0

minutes = 0


i = 0



while i < len(frames)-1:

disp = False

while not disp:

newTimestamp = time.time()

if (newTimestamp - oldTimestamp) >= TIMEOUT:


print(frames[int(i)])


newTimestamp = time.time()


i += (newTimestamp - oldTimestamp)/TIMEOUT


oldTimestamp = newTimestamp


disp = True


Remélhetőleg nem hagytam ki semmit. Előre is köszönöm a segítséget! :)

Ha mégis valami nem stimmel, amint tudom, megpróbálok segíteni. Nagyon örülnék, ha valaki tudna segíteni, egy fun kis project-et akarok ezzel kezdeni.

(Bocsánat ha bénázok, nem vagyok még nagyon jártas Gyakori kérdésekben)



2021. ápr. 8. 15:01
 1/3 anonim ***** válasza:
Először magyarázd el, hogy ez mire jó és miért nem jó mátrixosan kinyerni. Végtére a mátrix is is egy speciális vektor...
2021. ápr. 8. 17:21
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:
Én leginkább egy 3 dimenziós numpy tömbbe tenném bele ezt az egészet (x*y*frames), a tömb szeletelésével le tudod kérdezni az egyes pixelek vektorjait.
2021. ápr. 8. 17:35
Hasznos számodra ez a válasz?
 3/3 anonim ***** válasza:
63%

Ez valami CT-felvételehez kell?


Kipróbáltam egy tök CT-felvételén:

https://www.youtube.com/watch?v=uetp6HnfYjk


youtube-dl segítségével letöltöttem a legnagyobb (558x480-as) felbontású és (12 fps) képkocka-sebességű változatot:

youtube-dl -f 135 https://www.youtube.com/watch?v=uetp6HnfYjk # 558x480


ffmpeg segítségével kiszedtem a felvétel tartalmi részét (419x407-as felbontás) egy "oldframes" mappába képkockánként (171 darab)

ffmpeg -i video.mp4 -filter:v "crop=419:407:70:27" oldframes/video_%d.png


majd megcsináltam a topiknyitó kérdésben szereplő módon a szkriptet, ami betölti a képeket az "oldframes" mappából egy 3 dimenziós tömbbe, majd a tömb "elforgatása" után kigenerálja a képkockákat a "newframes" mappába:

[link]

a 12. sor befolyásolja, hogy melyik legyen a vízszintes (alapesetben 418 pixel), melyik a függőleges (alapesetben 406 pixel), és melyik az "időbeli" (alapesetben 171 képkocka) koordináta:

* [0,1,2] esetén 418x406x171: [link]

* [1,2,0] esetén 171x418x406: [link]

* [2,1,0] esetén 171x406x418: [link]

képek összefűzése GIF-animációba például:

ffmpeg -f image2 -framerate 12 -i newframes/video_%d.png xy.gif

2021. ápr. 8. 23:26
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!