Python实现图像平移、旋转、水平镜像等

本文介绍使用Python进行图像处理的基本操作,包括平移、缩放、旋转等变换,并提供了详细的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、图像平移
这里写图片描述
二、图像水平镜像
这里写图片描述
三、图像垂直镜像
这里写图片描述
四、图像缩放
这里写图片描述
这里写图片描述
五、图像旋转
这里写图片描述

Python代码实现:

import cv2
import math
import numpy as np

class Img:
    def __init__(self,image,rows,cols,center=[0,0]):
        self.src=image #原始图像
        self.rows=rows #原始图像的行
        self.cols=cols #原始图像的列
        self.center=center #旋转中心,默认是[0,0]

    def Move(self,delta_x,delta_y):      #平移
        #delta_x>0左移,delta_x<0右移
        #delta_y>0上移,delta_y<0下移
        self.transform=np.array([[1,0,delta_x],[0,1,delta_y],[0,0,1]])

    def Zoom(self,factor):               #缩放
        #factor>1表示缩小;factor<1表示放大
        self.transform=np.array([[factor,0,0],[0,factor,0],[0,0,1]])

    def Horizontal(self):                #水平镜像
        self.transform=np.array([[1,0,0],[0,-1,self.cols-1],[0,0,1]])

    def Vertically(self):                #垂直镜像
        self.transform=np.array([[-1,0,self.rows-1],[0,1,0],[0,0,1]])

    def Rotate(self,beta):               #旋转
        #beta>0表示逆时针旋转;beta<0表示顺时针旋转
        self.transform=np.array([[math.cos(beta),-math.sin(beta),0],
                                 [math.sin(beta), math.cos(beta),0],
                                 [    0,              0,         1]])

    def Process(self):
        self.dst=np.zeros((self.rows,self.cols),dtype=np.uint8)
        for i in range(self.rows):
            for j in range(self.cols):
                src_pos=np.array([i-self.center[0],j-self.center[1],1])
                [x,y,z]=np.dot(self.transform,src_pos)
                x=int(x)+self.center[0]
                y=int(y)+self.center[1]

                if x>=self.rows or y>=self.cols or x<0 or y<0:
                    self.dst[i][j]=255
                else:
                    self.dst[i][j]=self.src[x][y]

if __name__=='__main__':
    src=cv2.imread('.\jay.bmp',0)
    rows = src.shape[0]
    cols = src.shape[1]
    cv2.imshow('src', src)

    img=Img(src,rows,cols,[248,231])
    img.Vertically() #镜像
    img.Process()
    '''
    img.Rotate(-math.radians(180)) #旋转
    img.Process()
    img.Move(-50,-50) #平移
    img.Process()
    img.Zoom(0.5) #缩放
    img.Process()
    '''
    cv2.imshow('dst', img.dst)
    cv2.waitKey(0)

声明:图片均来自网络

<think>好的,用户需要的是使用Python实现图像增强算法的代码示例,特别是平移旋转镜像操作。首先,我得回忆一下OpenCV库的相关函数,因为这些操作通常都是用OpenCV来处理的。用户提到的三个操作:平移旋转镜像,对应的分别是仿射变换中的平移旋转变换,以及镜像翻转。 首先,平移的话,我记得需要构造一个平移矩阵,然后用warpAffine函数来实现平移矩阵是一个2x3的矩阵,前两列是单位矩阵,第三列是平移的tx和ty。例如,向右平移100像素,向下50像素,那么矩阵应该是[[1,0,100],[0,1,50]]。然后应用这个矩阵到原图。 然后是旋转旋转有两种方法,一种是使用cv2.rotate函数,比如ROTATE_90_CLOCKWISE,但这种方法只能旋转90度的整数倍。另一种更灵活的是使用getRotationMatrix2D来生成旋转矩阵,可以指定任意角度和旋转中心,再配合warpAffine。用户可能需要的是任意角度的旋转,所以得重点展示这种方法。例如,旋转30度,缩放因子1,中心点在图像中心。 接下来是镜像,也就是水平或垂直翻转。OpenCV有专门的flip函数,参数是flipCode,0是垂直翻转,1是水平翻转,-1是同时翻转。这部分相对简单,直接调用函数即可。 接下来需要组织代码结构,确保每个操作都有对应的函数或代码块,并且有注释说明。用户可能需要完整的示例代码,包括读取图像、应用各个变换、显示结果。同时,要注意图像路径可能需要用户自己修改,所以得提醒他们替换路径。 另外,用户提供的引用中有提到图像几何变换的相关内容,比如引用3和4,里面提到了仿射变换矩阵和旋转的具体实现方法。需要参考这些内容,确保代码的正确性。例如,引用4中的代码示例使用了cv.rotate和getRotationMatrix2D,这可以借鉴到当前的回答中。 还要考虑代码的兼容性,比如使用Python3和OpenCV的版本。需要确保函数名和参数正确,比如cv2.imread的路径处理,以及正确释放窗口资源。可能还要添加等待按键和销毁窗口的代码,避免图片一闪而过。 最后,生成相关问题,可能涉及其他图像增强算法,如缩放、仿射变换的其他应用,或者性能优化等。这可以帮助用户进一步探索相关主题。</think>以下是用Python实现图像平移旋转镜像的增强算法示例代码及说明: ```python import cv2 import numpy as np def image_translation(img, tx, ty): """图像平移""" h, w = img.shape[:2] # 构建平移矩阵 M = np.float32([[1, 0, tx], [0, 1, ty]]) translated = cv2.warpAffine(img, M, (w, h)) return translated def image_rotation(img, angle, scale=1.0): """图像旋转(任意角度)""" h, w = img.shape[:2] # 计算旋转中心 center = (w//2, h//2) # 获取旋转矩阵 M = cv2.getRotationMatrix2D(center, angle, scale) rotated = cv2.warpAffine(img, M, (w, h)) return rotated def image_mirror(img, mode=1): """图像镜像 mode=0: 垂直镜像 mode=1: 水平镜像(默认) mode=-1: 双向镜像 """ mirrored = cv2.flip(img, mode) return mirrored # 读取图像 img = cv2.imread("input.jpg") # 执行变换操作示例 translated_img = image_translation(img, 100, 50) # 右移100像素,下移50像素 rotated_img = image_rotation(img, 30) # 顺时针旋转30度 mirrored_img = image_mirror(img, 1) # 水平镜像 # 显示结果(需在支持图形界面的环境中运行) cv2.imshow("Original", img) cv2.imshow("Translated", translated_img) cv2.imshow("Rotated", rotated_img) cv2.imshow("Mirrored", mirrored_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 核心算法说明: 1. **平移变换**: - 通过仿射变换矩阵$M = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \end{bmatrix}$实现 - 使用$warpAffine$函数应用变换矩阵[^3][^5] 2. **旋转变换**: - 通过$getRotationMatrix2D$生成旋转矩阵: $$ M = \begin{bmatrix} \alpha & \beta & (1-\alpha) \cdot center_x - \beta \cdot center_y \\ -\beta & \alpha & \beta \cdot center_x + (1-\alpha) \cdot center_y \end{bmatrix} $$ 其中$\alpha = scale \cdot \cos\theta$, $\beta = scale \cdot \sin\theta$[^4] 3. **镜像变换**: - 基于矩阵行/列的反转操作,时间复杂度为$O(1)$[^2] ### 注意事项: 1. 图像路径需要替换为实际路径 2. 建议在Jupyter Notebook等交互式环境中运行显示 3. 旋转角度单位为度,正值表示逆时针旋转(OpenCV坐标系与常规数学坐标系相反) 4. 平移超出边界的部分默认填充黑色
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值