Python_code_使用OpenCV库实现对图像的_平移_旋转_缩放

实现功能:
图片旋转:按指定的角度对图片进行逆时针旋转
图片平移:按指定的像素大小对图片进行水平和垂直方向的平移
图片缩放:按指定的缩放倍数对图片进行水平方向和垂直方向的缩放

注: 图像的 shape 属性:高、宽、通道数
Image.open()方式读取图像:无法输出图像的shape属性(高、宽、通道数)
cv2.imread()方式读取图像:可以输出图像的shape属性

技巧:
新的文件名中,加入一些提示信息,
例如:处理过后的文件中带有 _ ,使得被处理后的文件不被再次处理

局限性:只能将文件保存到原有目录下


代码:

import os
import glob
from scipy import ndimage
import cv2
import numpy as np

'''获取文件夹下所有指定后缀的文件'''
def get_image_paths(folder):
#return glob.glob(os.path.join(folder, '*.png')) #png为结尾的文件
return glob.glob(os.path.join(folder, '*.jpg')) #jpg为结尾的文件

'''图片旋转:旋转指定角度'''
def image_rotate(filename,angle):
#读取文件
#im = Image.open(filename)
im = cv2.imread(filename)
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) #由于opencv默认读取为BGR,需要将其转化为RGB图像
#旋转指定的角度
new_image = ndimage.rotate(im,int(angle))
new_filename = filename[:-4] +'_rotate_' + str(angle) + '.jpg' #在原图片名称的基础上命名新的文件名称
cv2.imwrite(new_filename, new_image) #保存处理后的文件

'''图片平移,平移指定的距离'''
#思路:新建一个矩阵,将平移后对应位置的像素保存到新的矩阵中,最终返回新建的矩阵'''
def translation(filename,translate_x,translate_y):
# 读取文件
img = cv2.imread(filename)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #在该代码中由于opencv读取默认为BGR将其转化为RGB图像

img_h,img_w = img.shape[:2] #图像的shape属性包括:高、宽、通道数
# 新建矩阵dst,用于暂存平移后的图像像素值,初始时矩阵中所有默认值为0
dst = np.zeros(img.shape,dtype=np.uint8)
for row in range(img_h):
for col in range(img_w):
h = int(row-translate_y)
w = int(col-translate_x)
#平移后,在可现实区域部分的像素才可见,黑色进行填充剩余区域(像素默认值为0实现)
if h<img_h and h>=0 and w<img_w and w>=0:
dst[row][col] = img[h][w]
new_filename = filename[:-4] +'_translation_' + str(translate_x) +'_'+str(translate_y)+ '.jpg'
cv2.imwrite(new_filename, dst) #保存处理后的文件
return

'''图片缩放:
使用openCV 库中的resize函数,其中 zoom_x x的缩放倍数(0.5时,x变为原图的0.5倍),zoom_y y的缩放倍数'''
def zooming(filename,zoom_x,zoom_y):
# 读取文件
img = cv2.imread(filename)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #在该代码中由于opencv读取默认为BGR将其转化为RGB图像

new_image = cv2.resize(img,(int(img.shape[1]*zoom_x),int(img.shape[0]*zoom_y)))
#注意 cv2.resize()函数中第二部分的参数为一个元组,先是矩阵的宽,后是矩阵的高

print(img.shape) #输出原图像的高、宽、通道数,与处理后的图像shape属性进行对比
print(new_image.shape) #输出按指定倍数缩放后的图像的高、宽、通道数

new_filename = filename[:-4] +'_zooming_' + str(zoom_x) +'_'+str(zoom_y)+ '.jpg'
cv2.imwrite(new_filename, new_image) #保存处理后的文件
return


'''
主函数部分:进行函数调用
'''
#数据图片所在的目录(相对路径)
image_path = '..\data\test\' #target_path = '..\data\test\image_output\'
#获取该目录下所有图片文件
imgs = get_image_paths(image_path)


for i in imgs:
# 文件名中带有_ 表示此文件是已经被处理过的,不再进行处理
if '_' in i :
continue

#图片旋转
#参数:图片路径和指定的旋转角度
image_rotate(i,45)
'''
image_rotate(i,90)
image_rotate(i,180)
image_rotate(i,270)
'''

#图片平移
#参数:图片路径、水平向右平移距离,垂直向下平移距离
translation(i,0,100)

#图片缩放
#参数:图片路径、水平方向缩放倍数,垂直方向缩放倍数
zooming(i,0.5,1)
原文地址:https://www.cnblogs.com/lyj0123/p/11243792.html