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 resize
gebruiken.
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 scipy
module 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:
imresize
is verouderdin SciPy 1.0.0, en
wordt verwijderd in 1.2.0.
Gebruikskimage.transform.resize
in 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:
-
Handmatig;
height, width = src.shape[:2]
dst = cv2.resize(src, (2*width, 2*height), interpolation = cv2.INTER_CUBIC)
-
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)