[python opencv 计算机视觉零基础到实战]二十、图片缩放、位移、旋转
一、学习目标
- 了解图片如何进行缩放
- 了解图片如何进行位移
- 了解图片如何进行旋转
目录
上一节:[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()
结果如下:
三、总结
- 了解图片使用resize方法进行缩放
- 了解图片直接编辑数据进行位移
- 了解图片使用getRotationMatrix2D方法构件旋转矩阵后使用warpAffine进行变换从而得到旋转后的图片结果
- 分享
- 举报
-
浏览量:4802次2021-01-26 19:00:57
-
浏览量:5629次2021-01-02 22:50:35
-
浏览量:5238次2020-12-29 19:37:20
-
浏览量:4966次2021-01-11 15:33:50
-
2020-12-14 18:16:24
-
浏览量:5641次2020-12-21 16:50:21
-
浏览量:6770次2021-01-05 18:32:12
-
浏览量:7293次2020-12-21 20:12:30
-
浏览量:5679次2021-01-03 01:24:13
-
2021-01-19 23:49:13
-
浏览量:4428次2021-01-08 01:04:31
-
2021-01-12 21:31:51
-
浏览量:5456次2021-01-05 22:14:42
-
浏览量:5237次2021-01-12 23:46:34
-
浏览量:6081次2020-12-29 14:13:00
-
浏览量:6184次2020-12-25 23:18:24
-
浏览量:4609次2021-01-14 01:47:31
-
浏览量:8715次2020-12-16 22:21:43
-
浏览量:9384次2020-12-18 22:21:10
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
1_bit
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明