图片的几何变换
图片剪切
图片在程序中表示就是一个矩阵,我们要想操作图片,只需要操作矩阵元素就可以了。图片的剪切案例,其实我们只需要想办法截取出矩阵的一部分即可!
在python中,矩阵的截取是很容易的一件事!例如如下代码
mat[起始行号:结束行号,开始列号:结束列号]
import cv2
# 读取图片
img = cv2.imread('./timg.jpg', cv2.IMREAD_COLOR)
cv2.imshow('pic', img)
# 从图片中(230,230)截取一张 宽度为130,高度为70的图片 [起始行号:结束行号,开始列号:结束列号]
dstImg = img[180:280, 180:310]
# 显示图片
cv2.imshow('result', dstImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
图片镜像处理
图片的镜像处理其实就是将图像围绕某一个轴进行翻转,形成一幅新的图像. 我们经常可以通过某个小水坑看到天空中的云, 只不过这个云是倒着的! 这个就是我们称为的图片的镜像!
下面我们来看这样一个示例吧!我们将lena这张图片沿着x轴进行了翻转
如果我们想在一个窗口中显示出两张图片,那么我们就需要知道图片的宽高信息啦!
如何获取呢? 看下面的示例代码:
imgInfo = img.shape
imgInfo[0] : 表示高度
imgInfo[1] : 表示宽度
imgInfo[2] : 表示每个像素点由几个颜色值构成
知道了上述信息之后,我们就可以按照如下步骤实现啦!
实现步骤:
- 创建一个两倍于原图的空白矩阵
- 将图像的数据按照从前向后,从后向前进行绘制
代码实现:
import cv2
import numpy as np
img = cv2.imread('./timg.jpg', cv2.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 创建一个俩倍于原图大小的矩阵
dstImg = np.zeros((height * 2, width, 3), np.uint8)
# 向目标矩阵中填值
for row in range(height):
for col in range(width):
# 上半部分直接远扬填充
dstImg[row, col] = img[row, col]
# 下半部分倒叙填充
dstImg[height * 2 - row - 1, col] = img[row, col]
cv2.imshow('result', dstImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
图片缩放
对于图片的操作,我们经常会用到,放大缩小,位移,还有旋转,在接下来的课程中,我们将来学习这些操作!
首先,我们来看一下图片的缩放
关于图片的缩放,常用有俩种:
- 等比例缩放
- 任意比例缩放
要进行按比例缩放,我们需要知道图片的相关信息,我们可以通过一下操作:
imgInfo = img.shape
imgInfo[0] : 表示高度
imgInfo[1] : 表示宽度
imgInfo[2] : 表示每个像素点由几个颜色值构成
图片缩放的常见算法:
- 最近领域插值
- 双线性插值
- 像素关系重采样
- 立方插值
默认使用的是双线性插值法,这里我给出利用opencv提供的resize
方法来进行图片的缩放
import cv2
# 读取一张图片
img = cv2.imread('./timg.jpg', cv2.IMREAD_COLOR)
# 获取图片信息
imgInfo = img.shape
print(imgInfo)
# 获取图片的高度
height = imgInfo[0]
# 获取图片的宽度
width = imgInfo[1]
# 获取图片的颜色模式,表示每个像素点由3个组成
mode = imgInfo[2]
print(mode)
# 定义缩放比例
newHeight = int(height * 0.5)
newWidth = int(width * 0.5)
# 使用api缩放
newImg = cv2.resize(img, (newWidth, newHeight))
# 将图片展示出来
cv2.imshow('result', newImg)
cv2.waitKey(0)
cv2.destroyAllWindows()