zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    测试用例
    web 接口测试入门
    Web 安全测试
    Web 测试总结
    linux的基本操作(NFS服务配置)
    linux的基本操作(mysql 的基本操作)
    linux的基本操作(LNMP的基本操作)
    linux的基本操作(LAMP环境搭建)
    linux 的基本操作(linux系统的日常管理)
    Android官方技术文档翻译——ApplicationId 与 PackageName
  • 原文地址:https://www.cnblogs.com/lyj0123/p/11243792.html
Copyright © 2011-2022 走看看