Vreau să folosesc OpenCV2.0 și Python2.6 pentru a arăta imagini redimensionate. Am folosit si a adoptat exemplu la http://opencv.willowgarage.com/documentation/python/cookbook.html dar, din păcate, acest cod este pentru OpenCV2.1 și nu par să fie de lucru pe 2.0. Aici codul meu:
import os, glob
import cv
ulpath = "exampleshq/"
for infile in glob.glob( os.path.join(ulpath, "*.jpg") ):
im = cv.LoadImage(infile)
thumbnail = cv.CreateMat(im.rows/10, im.cols/10, cv.CV_8UC3)
cv.Resize(im, thumbnail)
cv.NamedWindow(infile)
cv.ShowImage(infile, thumbnail)
cv.WaitKey(0)
cv.DestroyWindow(name)
Din moment ce eu nu pot folosi
cv.LoadImageM
Am folosit
cv.LoadImage
în schimb, care a fost nici o problemă în alte aplicații. Cu toate acestea, cv-ul.iplimage nu are atributul rows, cols sau dimensiune. Poate cineva sa-mi dea un indiciu, cum să rezolve această problemă? Multumesc.
Dacă doriți să utilizați CV2, aveți nevoie pentru a utiliza "redimensiona" funcția.
De exemplu, acest lucru va redimensiona ambele axe de jumătate:
small = cv2.resize(image, (0,0), fx=0.5, fy=0.5)
și acest lucru va redimensiona imaginea pentru a avea 100 de coloane (lățime) și 50 de rânduri (înălțime):
resized_image = cv2.resize(image, (100, 50))
O altă opțiune este de a utiliza scipy
module, folosind:
small = scipy.misc.imresize(image, 0.5)
Există, evident, mai multe opțiuni pe care le puteți citi în documentația de aceste funcții (cv2.redimensionare, scipy.misc.imresize).
Actualizare: Conform SciPy documentația:
imresize
este depreciat în SciPy 1.0.0, și va fi eliminat în 1.2.0.
Utilizareaskimage.transform.resize
în loc.
Rețineți că, dacă're în căutarea de a redimensiona cu un factor, s-ar putea dori skimage.transform.rescale
.
Există două moduri de a redimensiona o imagine. Noua dimensiune pot fi specificate:
înălțime, lățime = src.forma[:2]
dst = cv2.resize(src, (2*lățime, 2*înălțime), interpolare = cv2.INTER_CUBIC)
dst = cv2.resize(src, Nici unul, fx = 2, ab = 2, interpolare = cv2.INTER_CUBIC)
,
unde fx este factorul de scalare a lungul axei orizontale și fy de-a lungul axei verticale.
Pentru a micșora o imagine, în general, va arata cel mai bine cu INTER_AREA interpolare, întrucât pentru a mări o imagine, în general, va arata cel mai bine cu INTER_CUBIC (lent) sau INTER_LINEAR (mai repede, dar încă arată BINE).
import cv2
img = cv2.imread('YOUR_PATH_TO_IMG')
height, width = img.shape[:2]
max_height = 300
max_width = 300
# only shrink if img is bigger than required
if max_height < height or max_width < width:
# get scaling factor
scaling_factor = max_height / float(height)
if max_width/float(width) < scaling_factor:
scaling_factor = max_width / float(width)
# resize image
img = cv2.resize(img, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA)
cv2.imshow("Shrinked image", img)
key = cv2.waitKey()
import cv2 as cv
im = cv.imread(path)
height, width = im.shape[:2]
thumbnail = cv.resize(im, (width/10, height/10), interpolation = cv.INTER_AREA)
cv.imshow('exampleshq', thumbnail)
cv.waitKey(0)
cv.destroyAllWindows()
Ai putea folosi GetSize funcție pentru a obține aceste informații, cv-ul.GetSize(im) ar reveni un tuplu cu lățimea și înălțimea imaginii. Puteți folosi, de asemenea, im.adâncimea și img.nChan pentru a obține mai multe informații.
Și pentru a redimensiona o imagine, mi-ar folosi un proces ușor diferit, cu o altă imagine în loc de o matrice. Este mai bine pentru a încerca să lucreze cu același tip de date:
size = cv.GetSize(im)
thumbnail = cv.CreateImage( ( size[0] / 10, size[1] / 10), im.depth, im.nChannels)
cv.Resize(im, thumbnail)
Sper că acest lucru ajută ;)
Julien
def rescale_by_height(image, target_height, method=cv2.INTER_LANCZOS4):
"""Rescale `image` to `target_height` (preserving aspect ratio)."""
w = int(round(target_height * image.shape[1] / image.shape[0]))
return cv2.resize(image, (w, target_height), interpolation=method)
def rescale_by_width(image, target_width, method=cv2.INTER_LANCZOS4):
"""Rescale `image` to `target_width` (preserving aspect ratio)."""
h = int(round(target_width * image.shape[0] / image.shape[1]))
return cv2.resize(image, (target_width, h), interpolation=method)
Aici's o funcție să mărim sau să scădem o imagine de dorit lățime sau înălțime în timp ce menținerea raportului de aspect
``
def maintain_aspect_ratio_resize(imagine, lățime=Nici unul, height=Nici unul, inter=cv2.INTER_AREA):
dim = Nimic (h, w) = imagine.forma[:2]
dacă lățimea este Nici unul și înălțimea este de Nici unul: întoarce imaginea
dacă lățimea este de Nici unul:
r = înălțime / float(h) dim = (int(w * r), înălțime)
altceva:
r = lățime / float(w) dim = (width, int(h * r))
reveni cv2.resize(imagine, dim, interpolare=inter) ``
Utilizare `` import cv2
imagine = cv2.imread('1.png') cv2.imshow('width_100', maintain_aspect_ratio_resize(imagine, width=100)) cv2.imshow('width_300', maintain_aspect_ratio_resize(imagine, lățime=300)) cv2.waitKey() ``
Folosind acest exemplu de imagine
Pur și simplu înjositor să width=100
(stânga) sau de lux a width=300
(dreapta)