小强学Python+OpenCV之-1.4.1平移、旋转、缩放、翻转-之实践
来源:互联网 发布:淘宝回血红包 手机 编辑:程序博客网 时间:2024/06/06 13:00
小强学Python+OpenCV之-1.4.1平移、旋转、缩放、翻转-之实践
- 小强学PythonOpenCV之141平移旋转缩放翻转之实践
- 平移
- 旋转
- 缩放
- 总结
- 翻转
- 总结
下面,我们对于本节的主题图片分别进行平移、旋转、缩放、翻转操作。
平移
首先,我们创建python脚本translation.py,并加入以下代码:
# 导入库import numpy as npimport argparseimport cv2# 定义平移translate函数def translate(image, x, y): # 定义平移矩阵 M = np.float32([[1, 0, x], [0, 1, y]]) shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0])) # 返回转换后的图像 return shifted# 构造参数解析器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)# 将原图分别做上、下、左、右平移操作shifted = translate(image, 0, 100)cv2.imshow("Shifted Down", shifted)shifted = translate(image, 0, -100)cv2.imshow("Shifted Up", shifted)shifted = translate(image, 50, 0)cv2.imshow("Shifted Right", shifted)shifted = translate(image, -50, 0)cv2.imshow("Shifted Left", shifted)cv2.waitKey(0)
执行脚本
python translation.py --image trip.jpg
显示如下:
旋转
创建python脚本rotation.py,并输入以下内容:
# 导入库import numpy as npimport argparseimport cv2# 定义旋转rotate函数def rotate(image, angle, center=None, scale=1.0): # 获取图像尺寸 (h, w) = image.shape[:2] # 若未指定旋转中心,则将图像中心设为旋转中心 if center is None: center = (w / 2, h / 2) # 执行旋转 M = cv2.getRotationMatrix2D(center, angle, scale) rotated = cv2.warpAffine(image, M, (w, h)) # 返回旋转后的图像 return rotated# 构造参数解析器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)# 将原图旋转不同角度rotated = rotate(image, 45)cv2.imshow("Rotated by 45 Degrees", rotated)rotated = rotate(image, -45)cv2.imshow("Rotated by -45 Degrees", rotated)rotated = rotate(image, 90)cv2.imshow("Rotated by 90 Degrees", rotated)rotated = rotate(image, -90)cv2.imshow("Rotated by -90 Degrees", rotated)rotated = rotate(image, 180)cv2.imshow("Rotated by 180 Degrees", rotated)cv2.waitKey(0)
执行脚本
python rotation.py --image trip.jpg
缩放
这里我们要取一张尺寸较小,但比较清晰的图像。用来比较放大和缩小之间的质量是否有损失。
创建python脚本resize.py,并输入以下内容:
# 导入库import argparseimport cv2# 定义缩放resize函数def resize(image, width=None, height=None, inter=cv2.INTER_AREA): # 初始化缩放比例,并获取图像尺寸 dim = None (h, w) = image.shape[:2] # 如果宽度和高度均为0,则返回原图 if width is None and height is None: return image # 宽度是0 if width is None: # 则根据高度计算缩放比例 r = height / float(h) dim = (int(w * r), height) # 如果高度为0 else: # 根据宽度计算缩放比例 r = width / float(w) dim = (width, int(h * r)) # 缩放图像 resized = cv2.resize(image, dim, interpolation=inter) # 返回缩放后的图像 return resized# 构造参数解析器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)# 创建插值方法数组methods = [ ("cv2.INTER_NEAREST", cv2.INTER_NEAREST), ("cv2.INTER_LINEAR", cv2.INTER_LINEAR), ("cv2.INTER_AREA", cv2.INTER_AREA), ("cv2.INTER_CUBIC", cv2.INTER_CUBIC), ("cv2.INTER_LANCZOS4", cv2.INTER_LANCZOS4)]# 循环执行插值方法数组中的各个方法for (name, method) in methods: # 放大3倍 resized = resize(image, width=image.shape[1] * 3, inter=method) cv2.imshow("ZoomIn Method: {}".format(name), resized) # 缩小2倍 resized = resize(image, width=image.shape[1] /2, inter=method) cv2.imshow("ZoomOut Method: {}".format(name), resized) cv2.waitKey(0)
执行脚本
python resize.py --image motor.jpg
使用cv2.INTER_NEAREST插值方法,缩小和放大后的图分别如下:
使用cv2.INTER_LINEAR插值方法,缩小和放大后的图分别如下:
使用cv2.INTER_AREA插值方法,缩小和放大后的图分别如下:
使用cv2.INTER_CUBIC插值方法,缩小和放大后的图分别如下:
使用cv2.INTER_LANCZOS4插值方法,缩小和放大后的图分别如下:
总结
- 在一般情况下, cv2.INTER_NEAREST速度最快,但质量不高。如果资源非常有限,可以考虑使用。否则不选这个,尤其在上采样(增加)图像的大小时。
- 当增加(上采样)图像的大小时,可以考虑使用 cv2.INTER_LINEAR 和 cv2.INTER_CUBIC两种插值方法。 cv2.INTER_LINEAR 方法比 cv2.INTER_CUBIC 方法稍快,但无论哪个效果都不错。
- 当减小(下采样)的图像的大小,OpenCV的文档建议使用 cv2.INTER_AREA。PS.我感觉其实下采样各种方法都差不多,取速度最快的(cv2.INTER_NEAREST)就好。
翻转
创建python脚本flip.py,并输入以下内容:
# 导入库import argparseimport cv2# 构造参数解析器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)# 横向翻转图像flipped = cv2.flip(image, 1)cv2.imshow("Flipped Horizontally", flipped)# 纵向翻转图像flipped = cv2.flip(image, 0)cv2.imshow("Flipped Vertically", flipped)# 同时在横向和纵向翻转图像flipped = cv2.flip(image, -1)cv2.imshow("Flipped Horizontally & Vertically", flipped)cv2.waitKey(0)
执行脚本python flip.py --image motor.jpg
总结
- 本节我们使用了函数,函数的定义为:
a) def translate(image, x, y): 使用def定义,跟函数名及形参,然后是冒号
b) 函数体缩进一个tab
c) 如果有嵌套语句,依次缩进 - 缩放要注意保持纵横比。
- 缩放时,下采样的插值算法选择比较宽松,可选择cv2.INTER_AREA。上采样时,要根据情况选择。在一般情况下选择cv2.INTER_LINEAR。资源紧张时选择 cv2.INTER_NEAREST。
阅读全文
1 0
- 小强学Python+OpenCV之-1.4.1平移、旋转、缩放、翻转-之实践
- 小强学Python+OpenCV之-1.4.1平移、旋转、缩放、翻转-之理论
- Python-OpenCv之图像基本处理-平移,缩放,旋转,翻转,裁剪及仿射变换
- OpenCV之仿射变换:平移、缩放、旋转
- OpenGL之旋转、平移、缩放
- Opencv 3仿射变换之缩放 平移 旋转 倾斜 反射 透视
- OpenCv-python之图像的缩放和旋转
- 动画效果之渐变、缩放、平移、旋转<代码实现>
- 计算机图形学之二维平移旋转缩放代码
- 【WebGL初学系列之五】旋转,平移,缩放
- 图形开发之基于向量矩阵的平移、旋转、缩放
- canvas之图形的变化(平移,缩放,旋转)
- canvas之图形的变化(保存,平移,缩放,旋转)
- canvas之图形的变化(平移,缩放,旋转)
- css3之元素的缩放、渐变、旋转和平移
- Unity3D开发之控制摄像机围绕物体旋转 平移 缩放
- 动画效果之渐变、缩放、平移、旋转<代码实现>
- opencv学习笔记之旋转和缩放
- 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)
- EventBus
- 邮局、区间、坐标
- 开发及生活感悟
- Android Dialog显示成Activity(全屏)
- 小强学Python+OpenCV之-1.4.1平移、旋转、缩放、翻转-之实践
- expect兼容多个回显内容
- 魅族flyme5、flyme6 使用过程 bug-碧油鸡 汇总
- Kotlin的初窥之kotlin配置
- Linux如何识别U盘
- LeetCode 463. Island Perimeter (算法, 矩阵遍历)
- 微擎框架之——install.php安装文件写入
- 说说Java生态圈的那些事儿
- python编码类型整理