精华内容
下载资源
问答
  • Matlab:图像平移算法的原理实现,缺陷分析及优化 文章目录1.怎么样确定平移之后新的图片的模板呢?2.图像中的坐标平移转换是如何实现的呢?在实现平移算法之前,我们首先来了解平移算法的背景知识:那么我们如何将...

    Matlab:图像平移算法的原理实现,缺陷分析及优化

    1.怎么样确定平移之后新的图片的模板呢?

    这里,我们主要通过转换公式来实现:

    在这里插入图片描述

    W,H代表平移后的图片模块大小;而ceil()代表上取整,w,h代表原来图片的大小,Apha为旋转角度。经代码实现后,我们可以得到新的图片模板:

    img=imread('pet.jpg');
    subplot(2,2,1),imshow(img);
    [h,w,k]=size(img);
    a=80;
    a=a*pi/180;
    w_new=ceil(w*cos(a)+h*sin(a));
    h_new=ceil(w*sin(a)+h*cos(a));
    img_new=zeros(h_new,w_new,k);
    %旋转
    subplot(2,2,2),imshow(img_new);
    

    如图所示:

    在这里插入图片描述

    2.图像中的坐标平移转换是如何实现的呢?

    在实现平移算法之前,我们首先来了解平移算法的背景知识:

    以逆时针旋转为例:

    在这里插入图片描述

    如图,旋转前的坐标为:

    x0=rcosθx_0=rcos{\theta}
    y0=rsinθy_0=r\sin{\theta}
    而旋转后的坐标为:
    χ1 :\chi_{1\ }:
    =rcos(θ+α)=rcos{\left(\theta+\alpha\right)}
    =rcosθcosαrsinθsinα=rcos{\theta c o s{\alpha}}-rsin{\theta s i n{\alpha}}
    =x0cosαy0sinα=x_0cos{\alpha}-y_0sin{\alpha}
    y1:y_1:
    =rsin(θ+α)=rsin{\left(\theta+\alpha\right)}
    =rsinθcosα+rcosθsinα=r\sin{\theta c o s{\alpha}}+r\cos{\theta s i n{\alpha}}
    =x0sinα+y0cosα=x_0\sin{\alpha}+y_0\cos{\alpha}

    通过以上的计算,我们可以得到平移矩阵:

    在这里插入图片描述

    这个时候,如果你对图像处理有一定的了解的话,你会发现这里的坐标采用的是数学里面的笛卡尔坐标系,而并不是我们的图像的坐标系。所以,为了实现坐标的转换,我们首先得实现坐标系的统一。

    那么我们如何将图像坐标系转换为笛卡尔坐标系(也就是我们熟悉的数学坐标系)呢?

    坐标系平移:

    在这里插入图片描述

    设图像宽度为W,高度为H,通过坐标系原点之间的位置关系,我们不难发现,由坐标系Ⅰ平移到Ⅱ的变换矩阵为:

    在这里插入图片描述

    而其逆矩阵为:

    在这里插入图片描述

    而我们得到图像平移的设计思路如下:

    • 将像素所在的图像坐标系转换为笛卡尔坐标系。
    • 将笛卡尔坐标系下的像素进行平移变换。
    • 将像素所在的笛卡尔坐标系转换为图像坐标系。
    coordination_shift=[1 0 -0.5*w;0 -1 0.5*h;0 0 1];%坐标系转换转换矩阵
    rotation=[cos(a) -sin(a) 0; sin(a) cos(a) 0;0 0 1];%旋转矩阵
    shift_back=[1 0 0.5*w_new;0 -1 0.5*h_new; 0 0 1];%还原坐标系矩阵
    
    for y=1:h
        for x=1:w
            xy_position=coordination_shift*[x;y;1];%将像素所在的图像坐标系转换为笛卡尔坐标系。
            xy_rotation=rotation*xy_position;%将笛卡尔坐标系下的像素进行平移变换。
            xy_new=round(shift_back*xy_rotation);%将像素所在的笛卡尔坐标系转换为图像坐标系。
            img_new(xy_new(2),xy_new(1),:)=img(y,x,:);
            end
        end
    end
    subplot(2,2,3),imshow(uint8(img_new));
    

    通过如上的算法及代码实现,我们可以得到基于图像平移算法的实现操作。

    3.上述步骤实现的图像平移算法的缺陷及优化

    问题一,当旋转角度过大时,无法实现图像平移?

    在这里插入图片描述

    原因分析:

    当角度过大时,图像的像素位置经过笛卡尔坐标系下的旋转后,还原为图像坐标系后可能会发生越界情况,导致无法实现其平移。

    解决方法:

    当经过旋转后还原为图像坐标系的像素点发生越界情况后,舍弃这些像素点:

     xy_new=round(shift_back*xy_rotation);%将像素所在的笛卡尔坐标系转换为图像坐标系。
       if xy_new(2)>0&&xy_new(2)<h+1&&xy_new(1)>0&&xy_new(1)<w+1
                img_new(xy_new(2),xy_new(1),:)=img(y,x,:);
    

    问题二,经过平移后的图像内部会存在大量黑点?

    在这里插入图片描述

    原因分析:

    因为旋转的计算采用了sin(),cos()三角函数计算,经过ceil()变化后,像素点会存在精度上的缺失。

    解决方法:

    这里,我采用的是当像素缺失点(x,y)的“四领域”均存在像素值时,该点填充像素点(x+1,y)的像素值。

    for y=2:h_new-1
        for x=2:w_new-1%这里需要注意的是,防止越界。
           if img_new(y,x,:)==0
                   img_new(y,x,:)=padding(x,y,img_new);
           end
        end
    end
    subplot(2,2,4),imshow(uint8(img_new));
    
    %自定义判定函数
    function [result]=padding(x,y,img)
    result=0;
    if img(y-1,x,:)>0
        if img(y,x-1,:)>0
            if img(y+1,x,:)>0
                if img(y,x+1,:)>0
                    result=img(y,x+1,:);
                else
                    result=0;
                end
            end
        end
    end
    end
    

    效果展示:

    在这里插入图片描述

    问题三,如何更好地优化填充算法呢?

    其实经过上述的填充算法,当旋转角度小于90°时,填充的效果较好;当旋转角度大于90时,如何更好地优化填充算法呢?这是留给笔者和阅读这篇文章的读者值得思考的问题。(。◕ˇ∀ˇ◕)

    展开全文
  • 写文章不易,如果您觉得此文对您有所... 仿射变换——图像平移 算法:仿射变换—图像平移算法,其中tx为在横轴上移动距离,ty为在纵轴上移动距离 ↑四. python实现仿射变换——图像平移import cv2import numpy a...

    写文章不易,如果您觉得此文对您有所帮助,请帮忙点赞、评论、收藏,感谢您!

    一. 仿射变换介绍:

    二. 仿射变换 公式:

    1cfb3fac3798

    仿射变换过程,(x,y)表示原图像中的坐标,(x',y')表示目标图像的坐标 ↑

    三. 仿射变换——图像平移 算法:

    1cfb3fac3798

    仿射变换—图像平移算法,其中tx为在横轴上移动的距离,ty为在纵轴上移动的距离 ↑

    四. python实现仿射变换——图像平移

    import cv2

    import numpy as np

    # 图像仿射变换->图像平移

    def affine(img, a, b, c, d, tx, ty):

    H, W, C = img.shape

    # temporary image

    tem = img.copy()

    img = np.zeros((H+2, W+2, C), dtype=np.float32)

    img[1:H+1, 1:W+1] = tem

    # get new image shape

    H_new = np.round(H * d).astype(np.int)

    W_new = np.round(W * a).astype(np.int)

    out = np.zeros((H_new+1, W_new+1, C), dtype=np.float32)

    # get position of new image

    x_new = np.tile(np.arange(W_new), (H_new, 1))

    y_new = np.arange(H_new).repeat(W_new).reshape(H_new, -1)

    # get position of original image by affine

    adbc = a * d - b * c

    x = np.round((d * x_new  - b * y_new) / adbc).astype(np.int) - tx + 1

    y = np.round((-c * x_new + a * y_new) / adbc).astype(np.int) - ty + 1

    # 避免目标图像对应的原图像中的坐标溢出

    x = np.minimum(np.maximum(x, 0), W+1).astype(np.int)

    y = np.minimum(np.maximum(y, 0), H+1).astype(np.int)

    # assgin pixcel to new image

    out[y_new, x_new] = img[y, x]

    out = out[:H_new, :W_new]

    out = out.astype(np.uint8)

    return out

    # Read image

    image1 = cv2.imread("../paojie.jpg").astype(np.float32)

    # Affine : 平移,tx(W向):向右30;ty(H向):向上100

    out = affine(image1, a=1, b=0, c=0, d=1, tx=30, ty=-100)

    # Save result

    cv2.imshow("result", out)

    cv2.imwrite("out.jpg", out)

    cv2.waitKey(0)

    cv2.destroyAllWindows()

    五. 代码实现过程中遇到的问题:

    ① 原图像进行仿射变换时,原图像中的坐标可能超出了目标图像的边界,需要对原图像坐标进行截断处理。如何做呢?首先,计算目标图像坐标对应的原图像坐标,算法如下:

    1cfb3fac3798

    目标图像坐标反向求解原图像坐标公式 ↑

    以下代码实现了该逆变换:

    # get position of original image by affine

    adbc = a * d - b * c

    x = np.round((d * x_new  - b * y_new) / adbc).astype(np.int) - tx + 1

    y = np.round((-c * x_new + a * y_new) / adbc).astype(np.int) - ty + 1

    然后对原图像坐标中溢出的坐标进行截断处理(取边界值),下面代码提供了这个功能:

    x = np.minimum(np.maximum(x, 0), W+1).astype(np.int)

    y = np.minimum(np.maximum(y, 0), H+1).astype(np.int)

    原图像范围:长W,高H

    ② 难点解答:

    x_new = np.tile(np.arange(W_new), (H_new, 1))

    y_new = np.arange(H_new).repeat(W_new).reshape(H_new, -1)

    1cfb3fac3798

    x_new 矩阵横向长 W_new,纵向长H_new ↑

    1cfb3fac3798

    y_new 矩阵横向长 W_new,纵向长H_new ↑

    造这两个矩阵是为了这一步:

    # assgin pixcel to new image

    out[y_new, x_new] = img[y, x]

    六. 实验结果:

    1cfb3fac3798

    原图 ↑

    1cfb3fac3798

    仿射变换—图像平移后结果(向右30像素,向上100像素) ↑

    七. 参考内容:

    八. 版权声明:

    未经作者允许,请勿随意转载抄袭,抄袭情节严重者,作者将考虑追究其法律责任,创作不易,感谢您的理解和配合!

    展开全文
  • 矩阵投影 旋转和平移都可以通过矩阵乘法得到 矩阵投影 Y维度是m * 1 A是m *n矩阵,X维度是n * 1 通过Y=A * X 可以实现从n维空间点到m维空间点线性变换 当m=n时,则可实现同维度空间矩阵旋转和平移 旋转 将...

    矩阵的投影 旋转和平移都可以通过矩阵乘法得到

    矩阵投影

    Y维度是m * 1 A是m *n的矩阵,X维度是n * 1
    通过Y=A * X
    可以实现从n维空间的点到m维空间点的线性变换
    当m=n时,则可实现同维度空间的矩阵旋转和平移

    旋转

    将矩阵XAX_A旋转角度a到矩阵XBX_B
    M=(cosasinasinacosa)M=(\begin{matrix} cosa&amp;-sina\\ sina&amp;cosa\end{matrix})
    XA=(xAyA)X_A=(\begin{matrix} x_A\\ y_A\end{matrix})
    XB=(xByB)=MXAX_B=(\begin{matrix} x_B\\ y_B\end{matrix})=M*X_A

    平移

    将矩阵XAX_A平移s到矩阵XBX_B
    XA=(xAyA)XA=(xAyA1)X_A=(\begin{matrix} x_A\\ y_A\end{matrix})》》》X_A=(\begin{matrix} x_A\\ y_A\\1\end{matrix})
    M=(10xs01ys001)M=(\begin{matrix} 1&amp;0&amp;x_s\\ 0&amp;1&amp;y_s\\0&amp;0&amp;1\end{matrix})
    XB=(xByB)=MXAX_B=(\begin{matrix} x_B\\ y_B\end{matrix})=M*X_A

    平移旋转

    将矩阵XAX_A旋转角度a,同时平移s到矩阵XBX_B
    M=(cosasinaxssinacosays001)M=(\begin{matrix} cosa&amp;-sina&amp;x_s\\sina&amp;cosa&amp;y_s\\0&amp;0&amp;1\end{matrix})
    XB=(xByB)=MXAX_B=(\begin{matrix} x_B\\ y_B\end{matrix})=M*X_A

    展开全文
  • 补充了矩阵相乘相加的相关知识;介绍了绘图中使用的旋转/缩放/平移的数学原理,以及在.NET中的操作方法。

    m×n 矩阵是排列在 m 行和 n 列中的一系列数。 下图显示几个矩阵。

    变换

    您可以通过将单个元素相加来加合两个尺寸相同的矩阵。 下图显示了两个矩阵相加的示例。

    变换

    m×n 矩阵可与一个 n×p 矩阵相乘,结果为一个 m×p 矩阵。 第一个矩阵的列数必须与第二个矩阵的行数相同。 例如,一个 4×2 矩阵与一个 2×3 矩阵相乘,产生一个 4×3 矩阵。

    矩阵的行列的平面点可视为矢量。 例如,(2, 5) 是具有两个组件的矢量,(3, 7, 1) 是具有三个组件的矢量。 两个矢量的点积定义如下:

    (a, b) • (c, d) = ac + bd

    (a, b, c) • (d, e, f) = ad + be + cf

    例如,(2, 3) 和 (5, 4) 的点积为 (2)(5) + (3)(4) = 22。 (2, 5, 1) 和 (4, 3, 1) 的点积为 (2)(4) + (5)(3) + (1)(1) = 24。 请注意,两个矢量的点积是一个数字,而不是另一个矢量。 另外请注意,只有当两个矢量的组件数相同时,才能计算点积。

    将 A(i, j) 作为矩阵 A 中第 i 行、第 j 列的项。 例如,A(3, 2)是矩阵 A 中第 3 行、第 2 列的项。 假定 A、B 和 C 是矩阵,且 AB = C, 则 C 的项计算如下:

    C(i, j) =(A 的第 i 行)•(B 的第 j 列)

    下图显示了矩阵相乘的几个示例。

    变换

    如果将平面中的点视为 1×2 矩阵,则可通过将该点乘以一个 2×2 矩阵来将该点变换。 下图显示了应用于点 (2, 1) 的几个变换。

    变换

    前图中显示的所有变换都是线性变换。 某些其他变换(如平移)不是线性的,不能表示为与 2×2 矩阵相乘的形式。 假定您要从点 (2, 1) 开始,将其旋转 90 度,在 x 方向将其平移 3 个单位,在 y 方向将其平移 4 个单位。 可通过先使用矩阵乘法再使用矩阵加法来完成此操作。

    变换

    后面跟一平移(与 1×2 矩阵相加)的线性变换(与 2×2 矩阵相乘)称为仿射变换。 将仿射变换存储于一对矩阵(一个用于线性部分,一个用于平移)的替换方案是将整个变换存储于 3×3 矩阵。 若要使其起作用,平面上的点必须存储于具有虚拟第三坐标的 1×3 矩阵中。 通常的方法是使所有的第三坐标等于 1。 例如,矩阵 [2 1 1] 代表点 (2, 1)。 下图演示了表示为与单个 3×3 矩阵相乘的仿射变换(旋转 90 度;在 x 方向上平移 3 个单位,在 y 方向上平移 4 个单位)。

    变换

    在前面的示例中,点 (2, 1) 映射到了点 (2, 6)。 请注意,3×3 矩阵的第三列包含数字 0,0,1。 对于仿射变换的 3×3 矩阵而言,情况将总是如此。 重要的数字是列 1 和列 2 中的 6 个数字。 矩阵左上角的 2×2 部分表示变换的线性部分,第 3 行中的前两项表示平移。

    变换

    在 GDI+ 中,可以在 Matrix 对象中存储仿射变换。 由于表示仿射变换的矩阵的第三列总是(0,0,1),因此在构造 Matrix 对象时,只需指定前两列中的 6 个数。 Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) 语句构造上面图形中显示的矩阵。

     


    复合变换是一个接一个的变换序列。 请考虑下面列表中的矩阵和变换:

    矩阵 A

    旋转 90 度

    矩阵 B

    在 x 方向上缩放 2 倍

    矩阵 C

    在 y 方向上平移 3 个单位

    如果从由矩阵 [2 1 1] 表示的点 (2, 1) 开始,并先后乘以 A、B、C,则点 (2, 1) 将按列出的顺序经历三种变换。

    [2 1 1]ABC = [-2 5 1]

    可以不将复合变换的三部分存储于三个独立的矩阵,而是一起乘以 A、B 和 C 来得到存储整个复合变换的单个的 3×3 矩阵。 假定 ABC = D, 则一个点乘以 D 得出的结果与一个点先后乘以 A、B、C 的结果相同。

    [2 1 1]D = [-2 5 1]

    下图显示了矩阵 A、B、C 和 D。

    变换

    复合变换的矩阵可通过将几个单独的变换矩阵相乘而得到,这就意味着任何仿射变换的序列均可存储于单个的 Matrix 对象中。

    警告说明警告

    复合变换的顺序非常重要。 一般说来,先旋转、再缩放、然后平移,与先缩放、再旋转、然后平移是不同的。 同样,矩阵相乘的顺序也是重要的。 一般说来,ABC 与 BAC 不同。

    Matrix 类提供了几种构建复合变换的方法:Multiply Rotate RotateAt Scale Shear Translate 下面的示例创建了复合变换(先旋转 30 度,再在 y 方向上缩放 2 倍,然后在 x 方向平移 5 个单位)的矩阵。

    Matrix myMatrix = new
     Matrix();
    myMatrix.Rotate(30);
    myMatrix.Scale(1, 2, MatrixOrder.Append);
    myMatrix.Translate(5, 0, MatrixOrder.Append);

    下图显示该矩阵。

    变换


    展开全文
  • 【最全】直方图平移信息隐藏原理及代码(matlab实现)可逆信息隐藏直方图平移功能快捷键合理创建标题,有助于目录生成如何改变文本样式插入链接与图片如何插入一段漂亮代码片生成一个适合你列表创建一个...
  • 用Altium Designer 9.4或者AD13.3.4画原理图,缩放和平移都十分卡顿,一个操作等5~10秒才反应。 以为是显卡驱动问题,重装了显卡驱动还是一样。后来发现将原理导航栏 Navigation关掉就好了,然后也进入PCB编辑...
  • 今天介绍一下旋转,平移以及尺度放缩基本原理。 点旋转 给定一个点P(x,y),以及一个角度θ\thetaθ,求逆时针旋转θ\thetaθ之后新点坐标P′P'P′位置。 我们用极坐标表示P x=Rcosϕx = Rcos\phix=Rcosϕ y...
  • 要想实现Mapxtreme Java 地图缩放,平移操作,那么必须了解下Mapj这个对象,这个是官方文档对MapJ名词解释:MapJ 是一个便捷小巧组件,提供了通过 MapXtremeServlet 或通过其本身来创建地图界面。...
  • 在two.js中,只提供了svg渲染时的鼠标事件,而canvas和webgl并没有提供,这样就对本人造成了很大的困扰,因此学习了下计算机图形学相关的知识,实现了利用two.js绘图...下面先来说下2d图形中平移和放缩的原理(非常重..
  • 本文内容仅供学习参考,如有错误欢迎读者批评指正几何变化原理:图像几何变换包括:图像空间平移、比例缩放、旋转、仿射变换和图像插值。图像几何变换实质:改变像素空间位置,估算新空间位置上像素值。图像...
  • 图像的平移操作

    千次阅读 2017-11-21 15:41:15
    左边平移图像的大小发生了,在保证图像平移的同时,也保存了完整的图像信息。右边的平移图像大小没有变化,故图像右下角的部分被截除了。 平移变换原理 设dx为水平偏移量,dy为垂直偏移量,(x0,y0)为原图像坐标,...
  • 本文提供一个本人编写的轨迹球类(ArcBall.cs),它可以直接应用到任何 camera 下,还可以同时实现缩放和平移。 工程源代码在文末。   1.轨迹球原理: 上面是我黑来的两张图,拿来说明轨迹球的原理。看左边这...
  • 在欧几里得几何中,平移是一种几何变换,表示把一幅图像...平移不变性意味着系统产生完全相同的响应(输出),不管它的输入是如何平移的 。 平移同变性(translation equivariance)意味着系统在不同位置的工作原理...
  • 图像平移的原理: x = x + Δx y = y + Δy 以下为图像平移的例子: 先定义一个move函数来返回移动后的图像: function J = move(I, a, b) [M, N, G] = size(I); I = im2double(I); J = ones(M + abs(a), N + abs...
  • 1.坐标系我们可以通过建立2D或3D笛卡尔坐标系来确定物体位置,然而在3D图形处理中我们会用到多种坐标系,这在特定场合下是非常有用。也就是说,使用它们可心简化我们开发图形程序难度,而且它们还可以相互...
  • 图像几何变换之平移

    千次阅读 2018-01-09 22:17:25
    图像的几何变换 一、引言 打开任意一个图像的编辑器,一般都可以进行对图像进行放大、缩小、旋转等操作,这类操作改变了原图中各区域的空间关系。对于这类操作,通常称为图像的几何变换...二、图像平移的原理 平移
  • 雾化器平移式喷射沉积模拟,李建平,唐青云,根据雾化器平移式喷射沉积装置制备大尺寸锭坯,以及雾化器平移式喷射沉积基本原理,建立雾化器平移式喷射沉积数值模型。
  • 第一部分 Matrix数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类。Android中Matrix是一个3 x 3矩阵,其内容如下: Matrix对图像处理可分为四类基本变换: Translate...
  • 先看图,其实归根结底都是透视投影的原理。 之前计算平移量的时候总是得不到正确的平移,也没有理解到为什么,经过实践检验真理,才真正理解到了原理。 在屏幕上的鼠标移动只是计算了在屏幕上移动的像素,要想正确...
  • 已知不共线三点在两个坐标系下面坐标,求解 两个坐标系转换参数,精度可满足一般程度上定位需求。步骤清楚,可直接上手code
  • 仿射变换的原理在条形码识别软件中有图像预览的功能。有时预览的图像需要进行转置(旋转180度或者90度)、缩放、镜像(左右反转)等操作。OpenCV提供了相应的函数进行以上操作。例如: 转置:cv::WarpAffine() ...
  • 无轨悬浮门工作原理:无轨直线门是运用杠杆平衡无轨悬浮门原理,经过两组“导向托轮”支撑着门片下梁,使整个门片脱离地上,再经过龙门架保证门片直立性,以此抵达开、关门功用。当关门时,即门片向前移动,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,486
精华内容 594
关键字:

平移的原理