OpenCV@IT·互联网程序员

小强学Python+OpenCV之-1.4.2裁剪

2017-05-22  本文已影响972人  Eric_AIPO

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

目标

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

mouth.png

实例

# 导入库
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.png

第二次裁剪结果:

mouth2.png

第三次裁剪结果:

mouth3.png

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

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

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

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

总结

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

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

上一篇下一篇

猜你喜欢

热点阅读