首页 > 技术知识 > 正文

一、学习目标

了解图片如何进行缩放 了解图片如何进行位移 了解图片如何进行旋转 目录

上一节:[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 4×4像素邻域的双三次插值 INTER_LANCZOS4 8×8像素邻域的Lanczos插值

我们首先读取一张图片;

import cv2 as cv img = cv.imread(rC:\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(rC:\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()

结果如下:

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

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

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

结果如下:

[python opencv 计算机视觉零基础到实战]二十、图片缩放、位移、旋转1对图片进行缩放时我们也可以不按比例进行缩放,这个时候只需要控制dsize我们所希望输出的大小即可,代码如下: import cv2 as cv img = cv.imread(rC:\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()

结果如下:

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

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

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

img = cv.imread(rC:\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(rC:\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()

结果如下:

[python opencv 计算机视觉零基础到实战]二十、图片缩放、位移、旋转3我们也可以上下位移,只需要将宽度增加100个单位换成高度减小100个单位即可: for i in range( x- 100 ): for j in range( y ): dst[i+ 100, j ] = img[i, j]

[python opencv 计算机视觉零基础到实战]二十、图片缩放、位移、旋转4也可以同时对高与宽进行平移,同理可得代码如下:

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

结果如下:

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

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

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

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

img = cv.imread(rC:\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(rC:\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()

结果如下:

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

三、总结

了解图片使用resize方法进行缩放 了解图片直接编辑数据进行位移 了解图片使用getRotationMatrix2D方法构件旋转矩阵后使用warpAffine进行变换从而得到旋转后的图片结果

猜你喜欢