小强学Python+OpenCV之-1.4.2裁剪

小强学Python+OpenCV之-1.4.2裁剪

问题引入:如果一幅图像中,你只对其中的一部分感兴趣(ROI(region of interest))。那么,如何将这部分ROI提取出来,丢掉其它部分呢?利用裁剪。

目标

本节看似是要完成对图像的裁剪,但我们裁剪图像用到的方法是,numpy的切片功能。所以本节的目标实际是要熟练掌握numpy的数组切片功能。
mouth

实例

# 导入库
import cv2
import argparse

# 构造参数解析器
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# 加载图像并显示
image = cv2.imread(args["image"])
cv2.imshow("Original", image)

# 第一次尝试把嘴的部位裁剪出来
mouth = image[85:250, 85:220]
cv2.imshow("Mouth1", mouth)
cv2.waitKey(0)

# 第二次尝试把嘴的部位裁剪出来
mouth = image[85:350, 285:420]
cv2.imshow("Mouth2", mouth)
cv2.waitKey(0)

# 第三次尝试把嘴的部位裁剪出来
mouth = image[85:250, 85:220]
cv2.imshow("Mouth3", mouth)
cv2.waitKey(0)

第一次裁剪结果:
mouth1

第二次裁剪结果:
mouth2

第三次裁剪结果:
mouth3

我们经过了三次尝试之后,终于把我们想要的区域裁剪出来。
这种笨方法实在是不能忍受,后面,我们会想办法把我们想要的区域自动裁剪出来。这是我们的目标。

但当下,我们先来了解一下ROI是怎么裁剪出来的。
看关键语句:

mouth = image[85:250, 85:220]

看上去,numpy的数组切片只需要提供高度区间和宽度区间即可。事实上也确实是这样。
上面的语句表示提取矩形区域(左上角坐标(85,85),右下角坐标(220,250))的图像。

总结

OK。就是这么简单,唯一需要注意的是,numpy表示的图像,高度(y坐标)在前,宽度(x坐标)在后。

关于切片操作,推荐博客:廖雪峰-Python教程-切片

你可以使用 Python 的一些库来截取子窗口的截图。其中,常用的库有 `pyautogui` 和 `Pillow`。 使用 `pyautogui` 库可以通过指定子窗口的位置坐标和大小,来截取该窗口的截图。下面是一个简单的示例代码: ```python import pyautogui # 获取子窗口的位置和大小 x, y, width, height = pyautogui.locateOnScreen('sub_window.png') # 根据位置和大小截取子窗口的截图 screenshot = pyautogui.screenshot(region=(x, y, width, height)) # 保存截图 screenshot.save('sub_window_screenshot.png') ``` 其中,`locateOnScreen()` 函数用于在屏幕上查找子窗口的位置和大小。你需要提供一个包含子窗口图像的文件路径,例如上述代码中的 `'sub_window.png'`。这个函数会返回子窗口的位置坐标和大小。 然后,使用 `screenshot()` 函数来截取子窗口的截图,参数 `region` 接受一个元组,包含子窗口的位置和大小。 最后,使用 `save()` 函数将截图保存到指定的文件路径中,例如上述代码中的 `'sub_window_screenshot.png'`。 另外,你也可以使用 `Pillow` 库来完成相同的任务。下面是一个示例代码: ```python from PIL import ImageGrab # 获取子窗口的位置和大小 x, y, width, height = pyautogui.locateOnScreen('sub_window.png') # 根据位置和大小截取子窗口的截图 screenshot = ImageGrab.grab(bbox=(x, y, x + width, y + height)) # 保存截图 screenshot.save('sub_window_screenshot.png') ``` 这里使用了 `ImageGrab` 模块的 `grab()` 函数来截取子窗口的截图。参数 `bbox` 接受一个元组,包含子窗口的位置和大小。 希望以上代码能帮到你!如果还有其他问题,请随时提问。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值