webentwicklung-frage-antwort-db.com.de

So ändern Sie die Größe eines Bildes mit OpenCV2.0 und Python2.6

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.

142
Bastian

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.
Verwenden skimage.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 .

307
emem

Beispiel Verdoppelung der Bildgröße

Es gibt zwei Möglichkeiten, die Größe eines Bildes zu ändern. Die neue Größe kann angegeben werden:

  1. Manuell;

    height, width = src.shape[:2]

    dst = cv2.resize(src, (2*width, 2*height), interpolation = cv2.INTER_CUBIC)

  2. 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.

Beispiel: Bild verkleinern, um es an eine maximale Höhe/Breite anzupassen (Seitenverhältnis beibehalten)

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()

Verwenden Sie Ihren Code mit cv2

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()
54
João Cartucho

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

7
jlengrand
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)
4
AndyP