如何使用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
这个,之前在其他应用中没有问题。不过,cv.iplimage没有rows、cols或size这些属性。有没有人能给我个提示,怎么解决这个问题?
5 个回答
你可以使用 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)
希望这能帮到你;)
Julien
示例:将图像大小加倍
调整图像大小有两种方法。你可以指定新的大小:
手动指定;
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()
在你的代码中使用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()
如果你想使用CV2库,你需要用到resize
这个函数。
比如,下面的代码会把图像的宽和高都缩小一半:
small = cv2.resize(image, (0,0), fx=0.5, fy=0.5)
而这段代码会把图像调整为宽100像素,高50像素:
resized_image = cv2.resize(image, (100, 50))
另外一个选择是使用scipy
模块,可以用下面的代码:
small = scipy.misc.imresize(image, 0.5)
当然,还有更多的选项,你可以在这些函数的文档中查看详细信息(cv2.resize, scipy.misc.imresize)。
更新:
根据SciPy的文档:
imresize
在SciPy 1.0.0版本中已经不推荐使用,并将在1.2.0版本中移除。
请使用skimage.transform.resize
来替代。
如果你想要按比例缩放,你可能更需要skimage.transform.rescale
。