我想使用OpenCV2.0和Python2.6来显示已调整大小的图像。我在http://opencv.willowgarage.com/documentation/python/cookbook.html使用并采用了示例,但不幸的是,这段代码适用于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
相反,这在其他应用程序中没有问题。然而,cv.iplimage没有属性行,列或大小。任何人都可以给我一个提示,如何解决这个问题?感谢。
答案 0 :(得分:297)
如果您想使用CV2,则需要使用resize
功能。
例如,这会将两个轴的大小调整一半:
small = cv2.resize(image, (0,0), fx=0.5, fy=0.5)
这将调整图像大小为100 cols(宽度)和50行(height):
resized_image = cv2.resize(image, (100, 50))
另一个选择是使用scipy
模块,使用:
small = scipy.misc.imresize(image, 0.5)
您可以在这些功能的文档中阅读更多选项(cv2.resize,scipy.misc.imresize)。
<强>更新强>
根据{{3}}:
SciPy 1.0.0中
imresize
已弃用,并且 将在1.2.0中删除。
请改用SciPy documentation。
请注意,如果您希望按系数调整大小,您实际上可能需要skimage.transform.resize
。
答案 1 :(得分:51)
有两种方法可以调整图像大小。可以指定新大小:
手动;
height, width = src.shape[:2]
dst = cv2.resize(src, (2*width, 2*height), interpolation = cv2.INTER_CUBIC)
按比例因子。
dst = cv2.resize(src, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC)
,
其中 fx 是横轴的缩放系数,纵轴是 fy 。
要缩小图像,通常使用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()
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()
答案 2 :(得分:7)
您可以使用GetSize函数获取这些信息, cv.GetSize(IM) 会返回一个具有图像宽度和高度的元组。 您还可以使用im.depth和img.nChan来获取更多信息。
要调整图像大小,我会使用稍微不同的过程,使用另一个图像而不是矩阵。最好尝试使用相同类型的数据:
size = cv.GetSize(im)
thumbnail = cv.CreateImage( ( size[0] / 10, size[1] / 10), im.depth, im.nChannels)
cv.Resize(im, thumbnail)
希望这会有所帮助;)
于连
答案 3 :(得分:4)
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 :(得分:2)
这是在保持宽高比的同时按所需的宽度或高度将图像放大或缩小的功能
# 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()
使用此示例图片
只需缩小为width=100
(左)或放大为width=300
(右)