基础Python OpenCV图像裁剪与缩放

6

有人可以帮我解决一下关于图像裁剪的算法问题吗?这个问题和 OpenCV 相关。我正在尝试解决它。我知道一个叫 crop = image[y:y1, x:x1] 的方法。如果我有一张新尺寸为 new_dimensionXxnew_dimensionY 像素的图片,并且我想把它裁剪成相同的宽度,但高度在 pointOfInterestX 上方 121 像素。我该怎么做呢?

还有一个问题:

image = cv2.resize(image,(int(new_dimensionX), int(new_dimensionY)))
cv2.imwrite("test6.jpg", image)

为什么文件test6.jpg没有反映出刚刚在它上面一行所做的缩放操作?

2个回答

7
当您使用imshow()显示调整大小的图像时,它会在屏幕上显示图像并根据图像像素更改显示窗口大小。当您使用图像查看器打开图像时,它会在固定的窗口大小中打开图像,窗口大小不取决于图像像素。
OpenCV提供了一个名为resize的函数来实现图像缩放。两种缩放图像的方法如下:
  1. 通过提供所需的大小

  2. 通过给出缩放因子

如果您没有指定大小(使用None),则它会期望X和Y缩放因子。
在提供缩放大小时。
import cv2
filename = "path_to_image"

oriimage = cv2.imread(filename)

print oriimage.shape
newx,newy = oriimage.shape[1]/4,oriimage.shape[0]/4 #new size (w,h)

newimage = cv2.resize(oriimage,(newx,newy))

print newimage.shape

cv2.imshow("original image",oriimage)
cv2.imshow("resize image",newimage)

cv2.waitKey(0)

带有缩放比例

import cv2
filename = "path_to_image"

image = cv2.imread(filename) 

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

large = cv2.resize(image, (0,0), fx=1.5, fy=1.5)

cv2.imshow("small image",small)
cv2.imshow("large image",large)

#To save rescale image
cv2.imwrite('s.jpg',small)
cv2.imwrite('l.jpg',large)

cv2.waitKey(0)

resize()方法的详细参数,请参考文档。

在OpenCV中裁剪图像。

import cv2
im_path = "path/to/image"
img = cv2.imread(im_path)

crop_img = img[0:400, 0:300] # Crop from {x, y, w, h } => {0, 0, 300, 400}

cv2.imshow("cropped", crop_img)
cv2.waitKey(0)

OpenCV的imread方法可以读取图像并返回一个Numpy数组,而Numpy数组的大小等于图像数组的大小。如果你想裁剪图像,只需选择一个数组。

img[0:400,0:300]

注意:img[y: y + h, x: x + w]中,第一个y表示起始位置,h表示高度;第二个x表示起始位置,w表示宽度。


为什么imwrite没有记录resize的更改,而imshow却显示了呢? - David Kachlon
@DavidKachlon 检查我的更新答案,在第二个例子中,我保存了重新缩放的图像。运行程序后比较所有图像的像素大小,发现所有图像的像素大小都不同。 - Kallz
图像 = cv2.resize(图像, (int(新尺寸X), int(新尺寸Y))) 裁剪图像 = 图像[int(兴趣点X-121):int(新尺寸Y), 0:int(新尺寸X-(兴趣点X+121))] cv2.imshow("发现的人脸", 裁剪图像) cv2.imwrite("裁剪后的.jpg", 裁剪图像)为什么第4行没有反映第1行所做的更改,但第3行却有呢? - David Kachlon
@DavidKachlon 在第一行中,您只需使用new_dimensionX和new_dimensionY调整图像大小,它可以工作。您必须检查保存的图像的像素是否等于调整大小的图像。当您显示图像时,它会在屏幕上显示图像并根据图像像素更改显示窗口大小。当您使用图像查看器打开图像时,它会在固定的窗口大小中打开图像,窗口大小不取决于图像像素。 - Kallz

0
import cv2
im_path = "path/to/image"
img = cv2.imread(im_path)

crop_img = img[0:400, 0:300] # Crop from {x, y, w, h } => {0, 0, 300, 400}

cv2.imshow("cropped", crop_img)
cv2.waitKey(0)

1
感谢您为Stack Overflow社区做出的贡献。这可能是一个正确的答案,但如果您能提供代码的额外解释,让开发人员能够理解您的推理过程,那将非常有用。对于不太熟悉语法或难以理解概念的新开发人员来说,这尤其有帮助。您是否可以编辑您的答案,包含更多细节,以造福整个社区? - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接