[python opencv 计算机视觉零基础到实战]二十、图片缩放、位移、旋转

1_bit 2021-01-19 16:45:32 4774

一、学习目标

  1. 了解图片如何进行缩放
  2. 了解图片如何进行位移
  3. 了解图片如何进行旋转

目录

上一节:[python opencv 计算机视觉零基础到实战] 十九、简易绘画板制作

二、了解图片的一般操作(缩放、位移)

2.1 了解如何对图片进行缩放操作

在opencv中,我们可以对图片进行缩放、旋转、位移、变换等操作。这一节我们将讲解相关的内容。

首先我们了解一下OpenCV中对图片的缩放操作。在OpenCV中对图片进行缩放使用resize方法,resize方法函数原型如下:

cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)

resize函数接收6个参数,分别是src、dst、Size、fx、fy以及interpolation,这几个参数的说明如下:

  • src为所需要进行操作的图片数据
  • dst为输出图片
  • Size为输出图片的尺寸
  • fx、fy分别为沿x轴缩放的系数以及沿y轴缩放的系数
  • interpolation为插入方式

interpolation 插入方式有五种,分别是:

  • INTER_NEAREST 近邻插值
  • INTER_LINEAR 双线性插值,也是默认的方法
  • INTER_AREA 像素区域关系进行重采样
  • INTER_CUBIC 4x4像素邻域的双三次插值
  • INTER_LANCZOS4 8x8像素邻域的Lanczos插值

我们首先读取一张图片;

import cv2 as cv

img = cv.imread(r'C:\Users\mx\Desktop\1.jpg')

由于我们使用使用缩放需要获取到图片的宽高:

x, y = img.shape[0:2]

随后将值传入到resize函数之中,由于我们是缩小4倍显示,所以宽高需要除4,传入值输出尺寸的参数中,也就是:

resize_img = cv.resize(img, (int(y / 4), int(x / 4)))

完整代码如下:

import cv2 as cv

img = cv.imread(r'C:\Users\mx\Desktop\1.jpg')

x, y = img.shape[0:2]
cv.imshow('img', img)
resize_img = cv.resize(img, (int(y / 4), int(x / 4)))
cv.imshow('resize0', resize_img)
cv.waitKey()
cv2.destroyAllWindows()

结果如下:

我们也可以将大小进行扩大:

resize_img = cv.resize(img, (int(y * 4), int(x * 4)))

结果如下:
对图片进行缩放时我们也可以不按比例进行缩放,这个时候只需要控制dsize我们所希望输出的大小即可,代码如下:

import cv2 as cv

img = cv.imread(r'C:\Users\mx\Desktop\1.jpg')
x, y = img.shape[0:2]
cv.imshow('img', img)
resize_img = cv.resize(img, (int(y / 4), int(x / 2)))
cv.imshow('resize0', resize_img)
cv.waitKey()
cv.destroyAllWindows()

结果如下:

2.2 了解如何对图片进行位移操作

在opencv中位移也是比较简单的,我们首先读取图片,并且读取到宽高以及通道,代码如下:

img = cv.imread(r'C:\Users\mx\Desktop\1.jpg')
x, y ,c = img.shape[0:3]

随后进行for循环嵌套循环遍历每一个坐标点的值,以上获取到的x为高y为宽,我们平移100个单位只需要在遍历后,在宽度y加100个单位的内容处赋予原图内容,这个时候整个图片就会产生位移的效果,并且在内循环宽度y的时候,需要减去100,因为我们平移后后面的内容将不会显示在当前内容中,代码如下:

for i in range( x ):
    for j in range( y - 100 ):
        dst[i, j + 100] = img[i, j]

完整代码如下:

import cv2 as cv
import numpy as np

img = cv.imread(r'C:\Users\mx\Desktop\1.jpg')
x, y ,c = img.shape[0:3]
dst = np.zeros(img.shape[0:3], np.uint8)
for i in range( x ):
    for j in range( y - 100 ):
        dst[i, j + 100] = img[i, j]

cv.imshow('image', dst)
cv.waitKey(0)
cv.destroyAllWindows()

结果如下:
我们也可以上下位移,只需要将宽度增加100个单位换成高度减小100个单位即可:

for i in range( x- 100 ):
    for j in range( y  ):
        dst[i+ 100, j ] = img[i, j]

也可以同时对高与宽进行平移,同理可得代码如下:

for i in range( x- 100 ):
    for j in range( y - 100 ):
        dst[ i+ 100, j + 100] = img[i, j]

结果如下:

2.3 了解如何对图片进行旋转操作

在OpenCV中对图片进行旋转需要使用一个方法getRotationMarix2D。getRotationMarix2D会定义一个旋转矩阵,我们只需要传入参数即可实现对图片的旋转操作。getRotationMarix2D接收3个三个参数,第一个是旋转中心、第二个是旋转角度、第三个是旋转后的图像缩放比例。

首先依旧是读取图片获取宽高:

img = cv.imread(r'C:\Users\mx\Desktop\1.jpg')
cv.namedWindow("Image",cv.WINDOW_NORMAL)
cv.namedWindow("src",cv.WINDOW_NORMAL)
x, y ,c = img.shape[0:3]

随后使用 getRotationMatrix2D 方法:

mr = cv.getRotationMatrix2D((x*0.5, y*0.5), 45, 0.5)

getRotationMatrix2D参数的第一个是旋转中心,(x0.5, y0.5)表示取中心点为旋转中心,45表示旋转角度,0.5表示缩放系数为原图的一半。随后定义好旋转矩阵后传入到warpAffine方法中。
warpAffine() 一共函数五个参数,我们暂时使用前三个,前三个的作用分别是:第一个参数为进行几何变换的图片,第二个为进行几何变换的关系矩阵,第三个为进行变换的中心坐标,代码如下:

dst = cv.warpAffine(img, mr, (x, y))

完整代码如下:

import cv2 as cv
import numpy as np

img = cv.imread(r'C:\Users\mx\Desktop\1.jpg')
cv.namedWindow("Image",cv.WINDOW_NORMAL)
cv.namedWindow("src",cv.WINDOW_NORMAL)
x, y ,c = img.shape[0:3]

mr = cv.getRotationMatrix2D((x*0.5, y*0.5), 45, 0.5)
dst = cv.warpAffine(img, mr, (x, y))

cv.imshow('Image', dst)
cv.imshow('src', img)
cv.waitKey(0)
cv.destroyAllWindows()

结果如下:

三、总结

  1. 了解图片使用resize方法进行缩放
  2. 了解图片直接编辑数据进行位移
  3. 了解图片使用getRotationMatrix2D方法构件旋转矩阵后使用warpAffine进行变换从而得到旋转后的图片结果
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
1_bit
红包 9 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
1_bit
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区