图像的几何变换—平移旋转镜像缩放剪切(原理+调用函数+像素操作)

Posted 小龙呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像的几何变换—平移旋转镜像缩放剪切(原理+调用函数+像素操作)相关的知识,希望对你有一定的参考价值。

目录

一、平移

1.调用函数(平移矩阵)

图像平移后的坐标:
[ x ′ y ′ 1 ] = [ 1 0 Δ x 0 1 Δ y 0 0 1 ] ⋅ [ x y 1 ] \\beginbmatrix x' \\\\ y' \\\\ 1 \\endbmatrix =\\beginbmatrix 1&0&\\Delta x \\\\ 0&1&\\Delta y \\\\ 0&0&1 \\endbmatrix \\cdot \\beginbmatrix x \\\\ y \\\\ 1 \\endbmatrix xy1 = 100010ΔxΔy1 xy1
x ′ = x + Δ x y ′ = y + Δ y \\begincases x' =x + \\Delta x \\\\ y' =y + \\Delta y \\endcases x=x+Δxy=y+Δy

warpAffine函数用法参考这里:warpAffine函数

程序实现及运行结果:

import cv2
import matplotlib.pyplot as plt
import numpy as np

# 读取图像
img1 = cv2.imread("flower.jpeg")

# 图像平移
h, w = img1.shape[:2]
M = np.float32([[1, 0, 100], [0, 1, 50]]) # 平移矩阵,y方向向下平移50,x方向向右平移100
dst = cv2.warpAffine(img1, M, (w, h))

# 图像显示
fig, axes = plt.subplots(1, 2, figsize=(10, 8), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(dst[:, :, ::-1])
axes[1].set_title("after translation")

plt.show()

2.像素操作(遍历赋值)

       算法思想很简单,首先将所有像素点沿x方向向右平移100,一行一行的进行处理,将(0,100)处的彩色值赋值给(0,0)处,(0,101)处的彩色值赋值给(0,1)处,然后把第0行所有列(521列)处理完。之后再处理下一行。同理沿着y方向向下平移50也是差不多这个思想。
       至于这个从520到0也是有讲究的,因为我们为了避免移动过程发生覆盖而数据丢失,所以需要倒序处理。打个比方,第0行,假如我们从0列到520列,那么100列之后的值就会被覆盖,这样我们就不能正确将原来100列之后的初始值进行移动(赋值),而我们从第520列处理就可以完美的避免这个问题。

程序实现及运行结果:

import cv2
import matplotlib.pyplot as plt

img1 = cv2.imread('flower.jpeg')
img2 = img1.copy()

# x方向向右平移100
for j in range(521):
    for i in range(520,-1,-1):
        if i<100:
            img2[j, i] = 0
        else:
            img2[j, i] = img2[j, i-100]

# y方向向下平移50
for u in range(521):
    for v in range(520,-1,-1):
        if v<50:
            img2[v, u] = 0
        else:
            img2[v, u] = img2[v-50, u]

# 图像显示
fig, axes = plt.subplots(1, 2, figsize=(10, 8), dpi=100)
axes[0].imshow(img1[:, :, ::-1])
axes[0].set_title("original")
axes[1].imshow(img2[:, :, ::-1])
axes[1].set_title("after translation")

plt.show()

二、旋转

1.调用函数(旋转矩阵)


极坐标:
x = r ⋅ c o s α y = r ⋅ s i n α \\begincases x =r \\cdot cos\\alpha \\\\ y =r \\cdot sin\\alpha \\endcases x=rcosαy=rsinα
x ′ = r ⋅ c o s ( α + θ ) = r ⋅ c o s α ⋅ c o s θ − r ⋅ s i n α ⋅ s i n θ = x ⋅ c o s θ − y ⋅ s i n θ y ′ = r ⋅ s i n ( α + θ ) = r ⋅ s i n α ⋅ c o s θ + r ⋅ c o s α ⋅ s i n θ = x ⋅ s i n θ + y ⋅ c o s θ \\begincases x' =r \\cdot cos(\\alpha+\\theta)\\\\ \\hspace0.4cm =r \\cdot cos\\alpha \\cdot cos\\theta - r \\cdot sin\\alpha \\cdot sin\\theta\\\\ \\hspace0.4cm =x \\cdot cos\\theta - y \\cdot sin\\theta\\\\ \\\\ y' =r \\cdot sin(\\alpha+\\theta)\\\\ \\hspace0.4cm =r \\cdot sin\\alpha \\cdot cos\\theta + r \\cdot cos\\alpha \\cdot sin\\theta\\\\ \\hspace0.4cm =x \\cdot sin\\theta + y \\cdot cos\\theta\\\\ \\endcases x=rcos(α+θ)=rcosαcosθrsinαsinθ=xcosθysinθy=rsin(α+θ)=rsinαcosθ+rcosαsinθ=xsinθ+ycosθ
直角坐标:
[ x ′ y ′ 1 ] = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] ⋅ [ x y 1 ] \\beginbmatrix x' \\\\ y' \\\\ 1 \\endbmatrix =\\beginbmatrix cos\\theta&-sin\\theta&0 \\\\ sin\\theta&cos\\theta&0 \\\\ 0&0&1 \\endbmatrix \\cdot \\beginbmatrix x \\\\ y \\\\ 1 \\endbmatrix xy1 = cosθsinθ0sinθcosθ0001 计算机图形学-图形学中的基本变换(缩放平移旋转剪切镜像)

对图像的仿射变换

opencv 图像平移缩放旋转翻转 图像仿射变换

几何变换——放大镜像平移旋转透视仿射

图像的仿射变换:cv2.warpAffine()

Python 计算机视觉—— OpenCV 进行图像几何变换