1. 图片分割
可以按照要求对整个图片进行大小的切分,比如这里将一个图片分割为四块,分别为左上、左下、右上和右下。具体实现代码如下
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
image = cv2.imread('1.jpg')
(h,w,c) = image.shape
#通过前边的示例明确shape是有三个对应值的
#分别为图片的高、宽、通道数,这里将其赋值给h,w,c变量,用来获取图片区域
cX,cY = (w//2,h//2)
top_left = image[0:cY,0:cX] #获取左上区域
top_right = image[0:cY,cX:w] #获取右上区域
bottom_left = image[cY:h,0:cX] #获取左下区域
bottom_right = image[cY:h,cX:w] #获取右下区域
#显示图片
def show(image):
plt.imshow(image)
plt.axis('off')
show(bottom_right)
#这里只输出一个示例,括号内部可以加入要显示的变量
→ 输出的结果为:(注意这里的图片颜色还是cv2读取的BGR的样式)
2. 图片像素修改
2.1 单点像素修改
先了解修改单点的图片像素值,注意的是cv2读取的是BGR的样式
#image[0:0]是指获取图片的左顶点
(b,g,r) = image[0,0]
print(b,g,r)
image[0,0] = (0,0,225)
print(b,g,r)
→ 输出的结果为:(改变单点的像素值,在图片几乎看不出来变化)
149 125 133
0 0 225
2.2 区域像素修改
结合上面介绍的图片分割,因此可以进行区域像素的填充,代码如下
image[0:cY,0:cX] = (0,255,0)
show(image)
→ 输出的结果为:(图片的四分之一被填充为绿色)
3. 图片平移
在保持图片大小的尺寸不变时,可以对图片进行平移的操作,原理就相当于图片在一个画布上进行移动,代码如下
#为了方便显示图片和矫正图片的颜色,这里可以自己定义函数进行图片的读取和显示
def show(image):
plt.imshow(image)
plt.axis('off')
def imread(image):
image = cv2.imread(image)
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
return image
#直接使用封装的函数读取图片
image = imread('D:/AI/1.jpg')
# 1,0 代表水平方向;0,1代表竖直方向;最后一个值为移动的像素大小
M = np.float32([[1,0,250],[0,1,500]])
# 要变换的图像;变换的方法;黑布的大小
shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
#显示图像
show(shifted)
→ 输出的结果为:
也可以进行自由的设定,比如将图片按照x,y轴的负方向进行移动,也可以调整黑布的大小(图片的大小不变),代码如下
#image = imread('D:/AI/1.jpg')
M = np.float32([[1,0,-0],[0,1,500]])
shifted = cv2.warpAffine(image, M, (image.shape[1]+500, image.shape[0]+1000))
show(shifted)
→ 输出的结果为:(基于刚刚x轴平移的长度,现在又平移回来了,与此同时,黑布大小发生了变化)
4. 图片旋转
旋转之前需要获取图片的宽和高的属性,比如最常见的按照图片的中心点旋转,有了宽和高就可以确定中心点的位置,代码如下
#获取中心点的位置
(h,w) = image.shape[:2]
(cX,cY) = (w/2,h/2)
#(cX,cY)旋转中心点
#45 逆时针旋转45度
#1.0 缩放
M = cv2.getRotationMatrix2D((cX,cY),45,1.0)
image = cv2.warpAffine(image,M,(w,h))
show(image)
→ 输出的结果为:(图片已经逆时针旋转45度)
其中的参数,比如旋转中心点的位置,旋转角度,图片的缩放比例以及黑布的大小都可以手动调整,比如进行图片的放大,就可直接调整缩放参数,代码如下
M = cv2.getRotationMatrix2D((cX,cY),0,2)
image = cv2.warpAffine(image,M,(w,h))
show(image)
→ 输出的结果为:(由于黑布的大小没有发生变化,图片变大两倍,相当于基于中心点的部分进行放大)
5. 图片尺寸修改
图片的尺寸修改相当于是把图片的像素点减少了,前面对于图片像素的修改是改变颜色,这里是改变图片的大小(像素的多少)
show(image)
print(image.shape)
→ 输出的结果为:(原图壁纸的大小)
可以人为的指定宽高,进行图片大小的变换
width = 150
high = 150
image = cv2.resize(image, (width,high))
show(image)
print(image.shape)
→ 输出的结果为:(图片变成正方形的形状了)
如果要按照约束性比例进行图片的大小变换,需要进行小小的计算,假如这里是给定宽,然后约束高,代码如下
image = imread('D:/AI/1.jpg')
width = 80
high = int(image.shape[0]*width/image.shape[1])
image = cv2.resize(image, (width,high))
show(image)
print(image.shape)
→ 输出的结果为:(图片的像素点减少,画面变得模糊)