【计算机视觉】图片分割、平移、旋转、像素及尺寸修改

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)

→ 输出的结果为:(图片的像素点减少,画面变得模糊)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lys_828/article/details/106171068