如何用OpenCV2.0和Python2.6调整图像大小

我想使用OpenCV2.0和Python2.6来显示调整大小的图像。我使用并采用了的例子,但不幸的是,这段代码用于OpenCV2.1,似乎不能在2.0上工作。下面是我的代码:

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)

因为我不能使用

cv.LoadImageM

我使用

cv.LoadImage

相反,这在其他应用程序中没有问题。然而,简历。Iplimage没有rows、cols或size属性。谁能给我个提示,怎么解决这个问题?

591002 次浏览
你可以使用GetSize函数来获取这些信息, cv.GetSize (im) 将返回一个具有图像宽度和高度的元组。 你也可以使用im。depth和img。nChan获取更多信息。< / p >

为了调整图像的大小,我会使用一个稍微不同的过程,用另一张图像而不是一个矩阵。最好尝试使用相同类型的数据:

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

希望这对你有所帮助;)

朱利安

如果你想使用CV2,你需要使用resize函数。

例如,这将把两个轴的大小调整一半:

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

这将调整图像的大小为100 cols(宽)和50行(高):

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

另一个选项是使用scipy模块,通过使用:

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

显然,你可以在这些函数(cv2.resizescipy.misc.imresize)的文档中阅读更多的选项。


< p > 更新: < br > 根据SciPy文档:

imresize在SciPy 1.0.0中是弃用,并且 将在1.2.0中删除。
使用skimage.transform.resize代替

注意,如果你正在寻找按一个因子调整大小,你可能实际上想要skimage.transform.rescale

示例将图像大小加倍

有两种方法可以调整图像的大小。新的大小可以指定:

  1. < p >手动;

    height, width = src.shape[:2]

    dst = cv2.resize(src, (2*width, 2*height), interpolation = cv2.INTER_CUBIC) < / p >

  2. 通过一个比例因子。

    < p > dst = cv2.resize(src, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC), 其中外汇是横轴上的比例因子,财政年度是纵轴上的比例因子。

要缩小图像,通常使用INTER_AREA插值效果最好,而要放大图像,通常使用INTER_CUBIC(慢)或INTER_LINEAR(快但看起来还可以)效果最好。

示例:缩小图像以适应最大高度/宽度(保持纵横比)

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

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

下面是一个函数,在保持纵横比的同时,根据所需的宽度或高度将图像放大或缩小

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

使用

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

使用这个示例图像

enter image description here

简单地缩小到width=100(左)或扩大到width=300(右)

enter image description here enter image description here < / p >