Ich möchte OpenCV2.0 und Python2.6 verwenden, um Bilder mit geänderter Größe anzuzeigen. Ich habe das Beispiel unter http://opencv.willowgarage.com/documentation/python/cookbook.html verwendet und übernommen, aber leider ist dieser Code für OpenCV2.1 und scheint nicht an 2.0 zu arbeiten. Hier mein Code:
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)
Da kann ich nicht gebrauchen
cv.LoadImageM
Ich benutzte
cv.LoadImage
stattdessen war das in anderen anwendungen kein problem. Trotzdem hat cv.iplimage keine Attributzeilen, Spalten oder Größen. Kann mir jemand einen Tipp geben, wie man dieses Problem löst? Vielen Dank.
Wenn Sie CV2 verwenden möchten, müssen Sie die Funktion resize
verwenden.
Dadurch werden beispielsweise beide Achsen um die Hälfte vergrößert:
small = cv2.resize(image, (0,0), fx=0.5, fy=0.5)
und dies wird die Größe des Bildes ändern, um 100 Spalten (Breite) und 50 Zeilen (Höhe) zu haben:
resized_image = cv2.resize(image, (100, 50))
Eine andere Möglichkeit ist die Verwendung des Moduls scipy
mit:
small = scipy.misc.imresize(image, 0.5)
Es gibt offensichtlich mehr Optionen, die Sie in der Dokumentation dieser Funktionen nachlesen können ( cv2.resize , scipy.misc.imresize ).
Update:
Laut SciPy-Dokumentation :
imresize
ist in SciPy 1.0.0 veraltet und wird in 1.2.0 entfernt.
Verwendenskimage.transform.resize
stattdessen.
Beachten Sie, dass Sie, wenn Sie die Größe um einen Faktor ändern möchten, möglicherweise tatsächlich skimage.transform.rescale
.
Es gibt zwei Möglichkeiten, die Größe eines Bildes zu ändern. Die neue Größe kann angegeben werden:
Manuell;
height, width = src.shape[:2]
dst = cv2.resize(src, (2*width, 2*height), interpolation = cv2.INTER_CUBIC)
Durch einen Skalierungsfaktor.
dst = cv2.resize(src, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC)
, wobei fx der Skalierungsfaktor entlang der horizontalen Achse und fy entlang der vertikalen Achse ist.
Um ein Bild zu verkleinern, sieht es mit der INTER_AREA-Interpolation im Allgemeinen am besten aus, während es mit INTER_CUBIC (langsam) oder INTER_LINEAR (schneller, aber immer noch in Ordnung) am besten aussieht, um ein Bild zu vergrößern.
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()
Sie können die GetSize-Funktion verwenden, um diese Informationen abzurufen. Cv.GetSize (im) gibt ein Tupel mit der Breite und Höhe des Bildes zurück. Sie können auch im.depth und img.nChan verwenden, um weitere Informationen zu erhalten.
Und um die Größe eines Bildes zu ändern, würde ich einen etwas anderen Prozess verwenden, mit einem anderen Bild anstelle einer Matrix. Es ist besser, mit dem gleichen Datentyp zu arbeiten:
size = cv.GetSize(im)
thumbnail = cv.CreateImage( ( size[0] / 10, size[1] / 10), im.depth, im.nChannels)
cv.Resize(im, thumbnail)
Hoffe das hilft ;)
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)