OpenCV-Python图像的缩放、翻转和旋转

喜欢ヅ旅行 2022-09-16 04:58 511阅读 0赞

图像的缩放

opencv中对图像进行放缩有两种方式可以实现,一种是使用指定尺寸放缩;一种是使用缩放比例放缩。

  • 指定尺寸
    cv2.resize(image, (1920, 1080),直接指定放缩后的尺寸大小。
  • 缩放比例
    cv2.resize(image, (0,0), fx=2.0, fy=2.0,使用放缩比例放缩图片。

此外,根据resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)函数的参数可知,还可以选择插值函数的类型。根据官方说明:缩小图像时,使用cv2.INTER_AREA插值函数效果好;放大图像时,使用cv2.INTER_CUBICcv2.INTER_LINEAR都行,但后者速度更快。

代码示例:

  1. # -*-coding:utf-8-*-
  2. """
  3. File Name: image_operation.py
  4. Program IDE: PyCharm
  5. Date: 16:24
  6. Create File By Author: Hong
  7. """
  8. import cv2 as cv
  9. import numpy as np
  10. def resize_image(image_path: str):
  11. img = cv.imread(image_path, cv.IMREAD_COLOR)
  12. cv.imshow('input', img)
  13. h, w, c = img.shape
  14. # 图片放缩, 指定尺寸
  15. # dst = cv.resize(img, (w * 2, h * 2), interpolation=cv.INTER_CUBIC)
  16. shrink = cv.resize(img, (w // 2, h // 2), interpolation=cv.INTER_AREA)
  17. # 缩放比例
  18. # dst = cv.resize(img, (0, 0), fx=0.75, fy=0.75, interpolation=cv.INTER_CUBIC)
  19. enlarge = cv.resize(img, (0, 0), fx=2.0, fy=2.0, interpolation=cv.INTER_CUBIC)
  20. cv.imshow('shrink', shrink)
  21. cv.imshow('enlarge', enlarge)
  22. cv.waitKey(0)
  23. cv.destroyAllWindows()
  24. if __name__ == '__main__':
  25. path = 'images/daiyutong.png'
  26. resize_image(path)

结果展示:

图像的放缩

图像的翻转

opencv翻转图像有三种方式,分别时上下翻转、左右翻转和对角线翻转,相对来说比较简单。

话不多说,直接上代码:

  1. # -*-coding:utf-8-*-
  2. """
  3. File Name: image_operation.py
  4. Program IDE: PyCharm
  5. Date: 16:24
  6. Create File By Author: Hong
  7. """
  8. import cv2 as cv
  9. import numpy as np
  10. def flip_image(image_path: str):
  11. img = cv.imread(image_path, cv.IMREAD_COLOR)
  12. cv.imshow('input', img)
  13. # 上下翻转
  14. dst1 = cv.flip(img, 0)
  15. res1 = np.vstack((img, dst1))
  16. # 左右翻转
  17. dst2 = cv.flip(img, 1)
  18. res2 = np.vstack((img, dst2))
  19. # 对角线翻转
  20. dst3 = cv.flip(img, -1)
  21. res3 = np.vstack((img, dst3))
  22. # 所有翻转结果在同一个窗口中显示
  23. result = np.hstack((res1, res2, res3))
  24. cv.imshow('flip', result)
  25. cv.imwrite('images/result_flip.jpg', result)
  26. cv.waitKey(0)
  27. cv.destroyAllWindows()
  28. if __name__ == '__main__':
  29. path = 'images/daiyutong.png'
  30. flip_image(path)

结果展示:

图像的翻转

图像的旋转

opencv中的图像旋转,指的是图像绕着中心点旋转任意角度之后得到新的图像。其中有两种旋转方式。

  1. 特定角度旋转函数。但只支持90、180、270这样特殊的角度旋转:
    dst1 = cv.rotate(img, cv.ROTATE_90_CLOCKWISE)顺时针90度旋转
    dst2 = cv.rotate(img, cv.ROTATE_180)顺时针180度旋转
    dst3 = cv.rotate(img, cv.ROTATE_90_COUNTERCLOCKWISE)顺时针270度旋转
  2. 旋转任意角度。需要用到旋转矩阵M,有两种方法获取旋转矩阵M:手动配置(此方法可以实现没有裁剪后的旋转图像)和内置函数获取。
    cv2.warpAffine(img, M, (w, h)): 任意角度旋转函数,参数分别是需要旋转的图像,旋转矩阵M,旋转后的图像size。此函数返回旋转后的图像。

具体实现代码:

  1. # -*-coding:utf-8-*-
  2. """
  3. File Name: image_operation.py
  4. Program IDE: PyCharm
  5. Date: 16:24
  6. Create File By Author: Hong
  7. """
  8. import cv2 as cv
  9. import numpy as np
  10. def rotate_image(image_path: str):
  11. """
  12. 旋转图像,介绍两种旋转方式。
  13. 1、特定角度旋转函数,但是只支持90、180、270这样特殊的角度旋转。
  14. 2、任意角度旋转函数,需要旋转矩阵M,有两种获取旋转矩阵M的方式:手动配置(可以实现没有裁剪后的旋转图像)和内置函数获取
  15. :param image_path: 传入的图像文件
  16. :return: 没有返回值
  17. """
  18. img = cv.imread(image_path, cv.IMREAD_COLOR)
  19. cv.imshow('input', img)
  20. h, w, c = img.shape
  21. # ###以下旋转方式获取的都是裁剪后的旋转图像#######
  22. # ##########手动设置旋转矩阵M#################
  23. # 定义空矩阵
  24. M = np.zeros((2, 3), dtype=np.float32)
  25. # 设定旋转角度
  26. alpha = np.cos(np.pi / 4.0)
  27. beta = np.sin(np.pi / 4.0)
  28. print('alpha: ', alpha)
  29. # 初始化旋转矩阵
  30. M[0, 0] = alpha
  31. M[1, 1] = alpha
  32. M[0, 1] = beta
  33. M[1, 0] = -beta
  34. # 图片中心点坐标
  35. cx = w / 2
  36. cy = h / 2
  37. # 变化的宽高
  38. tx = (1 - alpha) * cx - beta * cy
  39. ty = beta * cx + (1 - alpha) * cy
  40. M[0, 2] = tx
  41. M[1, 2] = ty
  42. # 内置函数获取旋转矩阵M,正值表示逆时针旋转,假设左上角是坐标原点
  43. M = cv.getRotationMatrix2D((w / 2, h / 2), 45, 1)
  44. # 执行旋转, 任意角度旋转
  45. result = cv.warpAffine(img, M, (w, h))
  46. # #######内置旋转函数,仅支持90,180,270#################
  47. dst1 = cv.rotate(img, cv.ROTATE_90_CLOCKWISE)
  48. dst2 = cv.rotate(img, cv.ROTATE_180)
  49. dst3 = cv.rotate(img, cv.ROTATE_90_COUNTERCLOCKWISE)
  50. # 将4张图像在一个窗口显示,注意:四张图像形状一致,否则会报错
  51. res = np.hstack((img, dst1, dst2, dst3))
  52. cv.imwrite('images/rotate4.jpg', res)
  53. cv.imshow('res', res)
  54. # 显示手动设置旋转角度的旋转图像结果
  55. result = np.hstack((img, result))
  56. cv.imwrite('images/rotate2.jpg', result)
  57. cv.imshow('rotate center', result)
  58. # # # #######获取没有裁剪的旋转图像#########
  59. # # 定义空矩阵
  60. # M = np.zeros((2, 3), dtype=np.float32)
  61. # # 设定旋转角度
  62. # alpha = np.cos(np.pi / 4.0)
  63. # beta = np.sin(np.pi / 4.0)
  64. # print('alpha: ', alpha)
  65. # # 初始化旋转矩阵
  66. # M[0, 0] = alpha
  67. # M[1, 1] = alpha
  68. # M[0, 1] = beta
  69. # M[1, 0] = -beta
  70. # # 图片中心点坐标
  71. # cx = w / 2
  72. # cy = h / 2
  73. #
  74. # # 变化的宽高
  75. # tx = (1 - alpha) * cx - beta * cy
  76. # ty = beta * cx + (1 - alpha) * cy
  77. # M[0, 2] = tx
  78. # M[1, 2] = ty
  79. #
  80. # # 旋转后的图像高、宽
  81. # rotated_w = int(h * np.abs(beta) + w * np.abs(alpha))
  82. # rotated_h = int(h * np.abs(alpha) + w * np.abs(beta))
  83. #
  84. # # 移动后的中心位置
  85. # M[0, 2] += rotated_w / 2 - cx
  86. # M[1, 2] += rotated_h / 2 - cy
  87. #
  88. # result = cv.warpAffine(img, M, (rotated_w, rotated_h))
  89. # cv.imshow('result', result)
  90. cv.waitKey(0)
  91. cv.destroyAllWindows()
  92. if __name__ == '__main__':
  93. path = 'images/daiyutong.png'
  94. rotate_image(path)

效果展示:

任意角度旋转
特定角度旋转

更多计算机视觉内容,请关注微信公众号 “AI与计算机视觉”

发表评论

表情:
评论列表 (有 0 条评论,511人围观)

还没有评论,来说两句吧...

相关阅读