小强学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教程-切片