Het formaat van een afbeelding wijzigen met OpenCV2.0 en Python2.6

Ik wil OpenCV2.0 en Python2.6 gebruiken om verkleinde afbeeldingen te tonen. Ik heb ditvoorbeeld gebruikt en overgenomen, maar helaas is deze code voor OpenCV2.1 en lijkt niet te werken op 2.0. Hier mijn 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)

Omdat ik niet kan gebruiken

cv.LoadImageM

Ik gebruikte

cv.LoadImage

in plaats daarvan, wat in andere applicaties geen probleem was. Desalniettemin heeft cv.iplimage geen attribuutrijen, cols of grootte. Kan iemand mij een hint geven hoe ik dit probleem kan oplossen?


Antwoord 1, autoriteit 100%

Als je CV2 wilt gebruiken, moet je de functie resizegebruiken.

Dit zal bijvoorbeeld de grootte van beide assen halveren:

small = cv2.resize(image, (0,0), fx=0.5, fy=0.5) 

en hierdoor wordt het formaat van de afbeelding aangepast tot 100 kolommen (breedte) en 50 rijen (hoogte):

resized_image = cv2.resize(image, (100, 50)) 

Een andere optie is om de scipymodule te gebruiken, door gebruik te maken van:

small = scipy.misc.imresize(image, 0.5)

Er zijn uiteraard meer opties die u kunt lezen in de documentatie van die functies (cv2.resize, scipy. misc.imresize).


Bijwerken:
Volgens de SciPy-documentatie:

imresizeis verouderdin SciPy 1.0.0, en
wordt verwijderd in 1.2.0.
Gebruik skimage.transform.resizein plaats daarvan.

Houd er rekening mee dat als u het formaat met een factor wilt wijzigen, u misschien skimage.transform.rescale.


Antwoord 2, autoriteit 18%

Voorbeeld verdubbeling van de afbeeldingsgrootte

Er zijn twee manieren om het formaat van een afbeelding te wijzigen. De nieuwe maat kan worden opgegeven:

  1. Handmatig;

    height, width = src.shape[:2]

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

  2. Door een schaalfactor.

    dst = cv2.resize(src, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC),
    waarbij fxde schaalfactor is langs de horizontale as en fylangs de verticale as.

Om een ​​afbeelding te verkleinen, zal het over het algemeen het beste uitzien met interpolatie van Inter_area, terwijl om een ​​afbeelding te vergroten, het over het algemeen het beste uitziet met inter_cubic (traag) of inter_linear (sneller, maar er is nog steeds oké).

Voorbeeld krimpende afbeelding om te passen op een maximale hoogte / breedte (bewaar de beeldverhouding)

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

Uw code gebruiken met CV2

import cv2 as cv
im = cv.imread(path)
height, width = im.shape[:2]
thumbnail = cv.resize(im, (round(width / 10), round(height / 10)), interpolation=cv.INTER_AREA)
cv.imshow('exampleshq', thumbnail)
cv.waitKey(0)
cv.destroyAllWindows()

Antwoord 3, Autoriteit 2%

U kunt de functie Gizei gebruiken om die informatie te krijgen,
cv.GetSize (im)
zou een tuple terugbrengen met de breedte en hoogte van het beeld.
U kunt IM.DEPTH en IMG.NCHAN ook gebruiken om wat meer informatie te krijgen.

En om de grootte van een afbeelding te wijzigen, zou ik een iets ander proces gebruiken, met een andere afbeelding in plaats van een matrix. Het is beter om te proberen met hetzelfde type gegevens te werken:

size = cv.GetSize(im)
thumbnail = cv.CreateImage( ( size[0] / 10, size[1] / 10), im.depth, im.nChannels)
cv.Resize(im, thumbnail)

Hopelijk helpt dit 😉

Julien


Antwoord 4, autoriteit 2%

Hier is een functie om een afbeelding op te schalen of te verkleinen met de gewenste breedte of hoogte met behoud van de beeldverhouding

# Resizes a image and maintains aspect ratio
def maintain_aspect_ratio_resize(image, width=None, height=None, inter=cv2.INTER_AREA):
    # Grab the image size and initialize dimensions
    dim = None
    (h, w) = image.shape[:2]
    # Return original image if no need to resize
    if width is None and height is None:
        return image
    # We are resizing height if width is none
    if width is None:
        # Calculate the ratio of the height and construct the dimensions
        r = height / float(h)
        dim = (int(w * r), height)
    # We are resizing width if height is none
    else:
        # Calculate the ratio of the width and construct the dimensions
        r = width / float(w)
        dim = (width, int(h * r))
    # Return the resized image
    return cv2.resize(image, dim, interpolation=inter)

Gebruik

import cv2
image = cv2.imread('1.png')
cv2.imshow('width_100', maintain_aspect_ratio_resize(image, width=100))
cv2.imshow('width_300', maintain_aspect_ratio_resize(image, width=300))
cv2.waitKey()

Deze voorbeeldafbeelding gebruiken

Gewoon downscalen naar width=100(links) of opschalen naar width=300(rechts)



Antwoord 5, Autoriteit 2%

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)

Other episodes