Skip navigation

Átméretezés

Átméretezés (OpenCV)

dst = cv2.resize(src, dsize, dst, fx=0, fy=0, interpolation=INTER_LINEAR)

dst Célkép. Nem lehet azonos a forrással! (Függvény paraméterként átadhatunk None értéket helyette, ha a visszatérési értéket használjuk.)
src Forráskép.
dsize Eredmény kép mérete. Felsorolási objektumként kell megadni, például dsize = (200, 100). Az első érték a szélesség, a második a magasság!
Ha None méretet adunk át, akkor az OpenCV számolja ki, ekkor viszont meg kell adni az fx és fy paramétereket:
dsize = (round(fx * src.shape[1]), round(fy * src.shape[0]))
fx Skálázás mértéke az X-tengely mentén.
Ha 0, akkor az OpenCV számolja ki a két képmátrix szélességének arányából:
fx = dsize[0] / src.shape[1]
fy Skálázás mértéke az Y-tengely mentén.
Ha 0, akkor az OpenCV számolja ki a két kép magasságának arányából:
fy = dsize[1] / src.shape[0]
interpolation

A kép újramintavételezésekor használt interpolációs módszer.

  • cv2.INTER_NEAREST: Legközelebbi szomszéd. Gyors, de nagyításkor "darabos" eredményt kapunk.
  • cv2.INTER_LINEAR: Lineáris. Nagyításkor lineáris átmenetet képez az intenzitás vagy színértékek között. Kevésbé darabos, de lassabb módszer. Ez az alapértelmezett módszer, ha nem adunk meg mást.
  • cv2.INTER_AREA: Terület-alapú számítás. Nagyításkor a legközelebbi szomszéd módszerhez hasonló eredményt kapunk. Kicsinyítéskor a területen belüli értékek átlagát kapjuk.
  • cv2.INTER_CUBIC: Köbös spline interpoláció 4x4 környezet alapján. Szebb eredmény, de jóval lassabb számítási idő.
  • cv2.INTER_LANCZOS4: Lanczos interpoláció 8x8 környezet alapján. Fotók nagyítására a legjobb, de a leglassabb megközelítés is.

Kicsinyítéskor a cv2.INTER_AREA a legcélszerűbb. Nagyításra a cv2.INTER_LANCZOS4 vagy a cv2.INTER_LINEAR (gyorsabb).

Példák:

  • Az új kép méretét explicit megadjuk, a nagyítási mértékek a forrás és a cél méretének aránya alapján számítódnak:
    dst = cv2.resize(src, (200, 100), intepolation=cv2.INTER_LINEAR)
  • A skálázás mértékét adjuk meg, az eredménykép méretét az OpenCV számítja ki (a példában irányonként a felére):
    dst = cv2.resize(src, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)

08_01_resize.py

Bementi színes kép átméretezése megadott szorzótényezőkkel, többféle interpolációs technikával.

import cv2

par_fx = 3
par_fy = 1.5

img = cv2.imread('calb.png', cv2.IMREAD_COLOR)

res_nearest = cv2.resize(img, None, fx=par_fx, fy=par_fy, interpolation=cv2.INTER_NEAREST)
res_linear = cv2.resize(img, None, fx=par_fx, fy=par_fy, interpolation=cv2.INTER_LINEAR)
res_area = cv2.resize(img, None, fx=par_fx, fy=par_fy, interpolation=cv2.INTER_AREA)
res_cubic = cv2.resize(img, None, fx=par_fx, fy=par_fy, interpolation=cv2.INTER_CUBIC)
res_lanczos4 = cv2.resize(img, None, fx=par_fx, fy=par_fy, interpolation=cv2.INTER_LANCZOS4)

cv2.imshow('Original', img)
cv2.imshow('Resampled nearest', res_nearest)
cv2.imshow('Resampled linear', res_linear)
cv2.imshow('Resampled area', res_area)
cv2.imshow('Resampled cubic spline', res_cubic)
cv2.imshow('Resampled Lanczos', res_lanczos4)

cv2.waitKey(0)
cv2.destroyAllWindows()

08_02_resize_2.py

Kép átméretezése explicit új képméret megadásával. A skálatényezők a képarányokból adódnak, amiket ellenőrzésképpen ki is írunk a konzolra. Figyeljünk arra, hogy az OpenCV és a Numpy más sor/oszlop sorrendet használ!


import cv2

img = cv2.imread('calb.png', cv2.IMREAD_COLOR)
print(img.shape)

dsize = (200, 100)
dst = cv2.resize(img, dsize, interpolation=cv2.INTER_AREA)

fx = dsize[0] / img.shape[1]
fy = dsize[1] / img.shape[0]

print('fx =', fx)
print('fy =', fy)

cv2.imshow('Original', img)
cv2.imshow('Resampled area', dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

08_photo_resizer.py

Ezzel a segédprogrammal fotókat tudunk átméretezni. Megadhatjuk a kívánt szélességet és magasságot. A program kiszámítja a nagyítási vagy kicsinyítési tényezőt, figyelembe véve, hogy az új kép szélessége és magassága se legyen nagyobb az általunk beállítottnál, és a képarány is megmaradjon.

Célszerűen nagy, sok megapixeles képet méretezhetünk át kisebbre, ami rendben megjelenik OpenCV imshow() ablakban.