一种图像旋转方法及装置与流程

文档序号:21368915发布日期:2020-07-04 04:44阅读:240来源:国知局
一种图像旋转方法及装置与流程

本申请涉及图像处理技术领域,特别是涉及一种图像旋转方法及装置。



背景技术:

随着图像处理技术的发展,图像的异形拼接逐渐成为热点。为实现图像的异形拼接,需要对摄像机采集的图像进行旋转。

目前,图像的旋转过程包括:对图像进行分块,得到多个图像块,将图像块写入输入缓存中;从输入缓存中读取所有的图像块进行旋转,得到旋转图像块;将旋转图像块写入输出缓存中。上述输入缓存和输出缓存属于内存,旋转图像需要向内存中写入两次数据,从内存中读出一次数据。这使得数据总线的占用时间较长,进而导致内存带宽的浪费。



技术实现要素:

本申请实施例的目的在于提供一种图像旋转方法及装置,以减少数据总线的占用时间,降低内存带宽的浪费。具体技术方案如下:

为实现上述目的,本申请实施例提供了一种图像旋转方法,所述方法包括:

对原始图像进行分块,得到多个图像块;

将所述多个图像块写入内存中;每一图像块中包括多个图像子块;

确定所述多个图像块中旋转裁剪框覆盖的图像块,作为目标图像块;

对于所述目标图像块中的每一像素点,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标;所述原始坐标系为所述原始图像的坐标系,所述旋转坐标系为旋转图像的坐标系;

确定多个第一参考坐标在所述旋转坐标系下的多个目标坐标;

对于每一目标坐标,将该目标坐标转换为所述原始坐标系下的第二参考坐标;

对于每一第二参考坐标,若该第二参考坐标所在的图像子块与该第二参考坐标对应的原始坐标所在的图像子块相同,则采用插值算法,计算该第二参考坐标对应的目标坐标处像素点的像素值,并将该第二参考坐标对应的目标坐标处的像素点写入输出缓冲器(buffer)。

可选的,所述对原始图像进行分块,得到多个图像块的步骤,包括:

对原始图像进行分块,得到多个分割块;

在每个分割块的第一侧拼接一行像素点,并在每个分割块的第二侧拼接一列像素点,得到多个图像块,所述第一侧为上侧或下侧,所述第二侧为左侧或右侧。

可选的,所述对原始图像进行分块,得到多个图像块的步骤,包括:

在原始图像的行尾和/或帧尾进行图像填充,得到目标图像;所述目标图像的尺寸能被预设图像块尺寸整除;

对所述目标图像进行分块,得到多个图像块。

可选的,所述确定所述多个图像块中旋转裁剪框覆盖的图像块,作为目标图像块的步骤,包括:

获取旋转裁剪框的旋转参数;所述旋转参数包括所述旋转裁剪框的起点在所述原始坐标系下的坐标,所述旋转裁剪框的旋转角度,以及所述旋转裁剪框的宽高;

根据所述旋转参数,将所述旋转裁剪框中像素点在所述旋转坐标系下的旋转坐标,转换为所述原始坐标系下的第三参考坐标;

将所述第三参考坐标所在的图像块作为目标图像块。

可选的,所述对于所述目标图像块中的每一像素点,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标的步骤,包括:

对于所述目标图像块中的每一像素点,利用以下公式,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标:

dst_x′=(src_x′-src_x_start)*cosθ+(src_y′-src_y_start)*sinθ;

dst_y′=(src_x′-src_x_start)*sinθ-(src_y′-src_y_start)*cosθ;

其中,dst_x'为所述第一参考坐标的横坐标,dst_y'为所述第一参考坐标的纵坐标,src_x'为所述原始坐标的横坐标,src_y'为所述原始坐标的纵坐标,θ为所述旋转裁剪框的旋转角度,src_x_start为所述旋转裁剪框的起点在所述原始坐标系下的横坐标,src_y_start为所述旋转裁剪框的起点在所述原始坐标系下的纵坐标。

可选的,所述确定多个第一参考坐标在所述旋转坐标系下的多个目标坐标的步骤,包括:

对于每一第一参考坐标,对该第一参考坐标向上取整和向下取整,得到目标坐标。

可选的,所述对于每一第一参考坐标,对该第一参考坐标向上取整和向下取整,得到目标坐标的步骤,包括:

对于每一第一参考坐标,对该第一参考坐标向上取整和向下取整,得到该第一参考坐标对应的过渡坐标;

对于位于同一图像子块的多个第一参考坐标,将这多个第一参考坐标对应的过渡坐标中重复次数大于等于预设次数阈值的过渡坐标,以及这多个第一参考坐标为整数的第一参考坐标,确定为目标坐标。

可选的,所述对于每一目标坐标,将该目标坐标转换为所述原始坐标系下的第二参考坐标的步骤,包括:

对于每一目标坐标,利用以下公式,将该目标坐标转换为所述原始坐标系下的第二参考坐标:

src_x″=src_x_strat+dst_x″*cosθ-dst_y″*sinθ;

src_y″=src_y_start+dst_x″*sinθ+dst_y″*cosθ;

其中,dst_x”为所述目标坐标的横坐标,dst_y”为所述目标坐标的纵坐标,src_x”为所述第二参考坐标的横坐标,src_y”为所述第二参考坐标的纵坐标,θ为所述旋转裁剪框的旋转角度,src_x_start为所述旋转裁剪框的起点在所述原始坐标系下的横坐标,src_y_start为所述旋转裁剪框的起点在所述原始坐标系下的纵坐标。

可选的,所述将该第二参考坐标对应的目标坐标处的像素点写入输出缓冲器的步骤,包括:

确定该第二参考坐标对应的目标坐标处的像素点,在所述旋转图像中的目标像素行和目标位置;

根据所述目标像素行和所述目标位置,从预设行缓冲器中确定该第二参考坐标对应的目标坐标处的像素点对应的目标行缓冲器,以及该第二参考坐标对应的目标坐标处的像素点在所述目标行缓冲器中的缓存地址;

将该第二参考坐标对应的目标坐标处的像素点写入所述目标行缓冲器的缓存地址处;

当读取到所述目标行缓冲器对应的行尾结束标志时,读取所述目标行缓冲器中存储的数据,并写入输出缓冲器。

可选的,在将该第二参考坐标对应的目标坐标处的像素点写入所述目标行缓冲器的地址处之前,还包括:

向所述目标行缓冲器中写入背景色。

可选的,所述预设行缓冲器为滚筒式行缓冲器;所述预设行缓冲器的个数根据图像块的斜对角线的长度值,以及读命令产生的行间隔所确定的。

可选的,在当读取到所述目标行缓冲器对应的行尾结束标志时,读取所述目标行缓冲器中存储的数据,并写入输出缓冲器之后,还包括:

从所述目标行缓冲器开始,滚筒往下移动所述读命令产生的行间隔。

为实现上述目的,本申请实施例还提供了一种图像旋转装置,所述装置包括:

分块模块,用于对原始图像进行分块,得到多个图像块;

第一写入模块,用于将所述多个图像块写入内存中;每一图像块中包括多个图像子块;

第一确定模块,用于确定所述多个图像块中旋转裁剪框覆盖的图像块,作为目标图像块;

第一转换模块,用于对于所述目标图像块中的每一像素点,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标;所述原始坐标系为所述原始图像的坐标系,所述旋转坐标系为旋转图像的坐标系;

第二确定模块,用于确定多个第一参考坐标在所述旋转坐标系下的多个目标坐标;

第二转换模块,用于对于每一目标坐标,将该目标坐标转换为所述原始坐标系下的第二参考坐标;

计算模块,用于对于每一第二参考坐标,若该第二参考坐标所在的图像子块与该第二参考坐标对应的原始坐标所在的图像子块相同,则采用插值算法,计算该第二参考坐标对应的目标坐标处像素点的像素值,并将该第二参考坐标对应的目标坐标处的像素点写入输出缓冲器。

可选的,所述分块模块,具体用于:

对原始图像进行分块,得到多个分割块;

在每个分割块的第一侧拼接一行像素点,并在每个分割块的第二侧拼接一列像素点,得到多个图像块,所述第一侧为上侧或下侧,所述第二侧为左侧或右侧。

可选的,所述分块模块,具体用于:

在原始图像的行尾和/或帧尾进行图像填充,得到目标图像;所述目标图像的尺寸能被预设图像块尺寸整除;

对所述目标图像进行分块,得到多个图像块。

可选的,所述第一确定模块,具体用于:

获取旋转裁剪框的旋转参数;所述旋转参数包括所述旋转裁剪框的起点在所述原始坐标系下的坐标,所述旋转裁剪框的旋转角度,以及所述旋转裁剪框的宽高;

根据所述旋转参数,将所述旋转裁剪框中像素点在所述旋转坐标系下的旋转坐标,转换为所述原始坐标系下的第三参考坐标;

将所述第三参考坐标所在的图像块作为目标图像块。

可选的,所述第一转换模块,具体用于:

对于所述目标图像块中的每一像素点,利用以下公式,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标:

dst_x′=(src_x′-src_x_start)*cosθ+(src_y′-src_y_start)*sinθ;

dst_y′=(src_x′-src_x_start)*sinθ-(src_y′-src_y_start)*cosθ;

其中,dst_x'为所述第一参考坐标的横坐标,dst_y'为所述第一参考坐标的纵坐标,src_x'为所述原始坐标的横坐标,src_y'为所述原始坐标的纵坐标,θ为所述旋转裁剪框的旋转角度,src_x_start为所述旋转裁剪框的起点在所述原始坐标系下的横坐标,src_y_start为所述旋转裁剪框的起点在所述原始坐标系下的纵坐标。

可选的,所述第二确定模块,具体用于:

对于每一第一参考坐标,对该第一参考坐标向上取整和向下取整,得到目标坐标。

可选的,所述第二确定模块,具体用于:

对于每一第一参考坐标,对该第一参考坐标向上取整和向下取整,得到该第一参考坐标对应的过渡坐标;

对于位于同一图像子块的多个第一参考坐标,将这多个第一参考坐标对应的过渡坐标中重复次数大于等于预设次数阈值的过渡坐标,以及这多个第一参考坐标为整数的第一参考坐标,确定为目标坐标。

可选的,所述第二转换模块,具体用于:

对于每一目标坐标,利用以下公式,将该目标坐标转换为所述原始坐标系下的第二参考坐标:

src_x″=src_x_strat+dst_x″*cosθ-dst_y″*sinθ;

src_y″=src_y_start+dst_x″*sinθ+dst_y″*cosθ;

其中,dst_x”为所述目标坐标的横坐标,dst_y”为所述目标坐标的纵坐标,src_x”为所述第二参考坐标的横坐标,src_y”为所述第二参考坐标的纵坐标,θ为所述旋转裁剪框的旋转角度,src_x_start为所述旋转裁剪框的起点在所述原始坐标系下的横坐标,src_y_start为所述旋转裁剪框的起点在所述原始坐标系下的纵坐标。

可选的,所述计算模块,具体用于:

确定该第二参考坐标对应的目标坐标处的像素点,在所述旋转图像中的目标像素行和目标位置;

根据所述目标像素行和所述目标位置,从预设行缓冲器中确定该第二参考坐标对应的目标坐标处的像素点对应的目标行缓冲器,以及该第二参考坐标对应的目标坐标处的像素点在所述目标行缓冲器中的缓存地址;

将该第二参考坐标对应的目标坐标处的像素点写入所述目标行缓冲器的缓存地址处;

当读取到所述目标行缓冲器对应的行尾结束标志时,读取所述目标行缓冲器中存储的数据,并写入输出缓冲器。

可选的,所述装置还包括:第二写入模块,用于在将该第二参考坐标对应的目标坐标处的像素点写入所述目标行缓冲器的地址处之前,向所述目标行缓冲器中写入背景色。

可选的,所述预设行缓冲器为滚筒式行缓冲器;所述预设行缓冲器的个数根据图像块的斜对角线的长度值,以及读命令产生的行间隔所确定的。

可选的,所述装置还包括滚筒模块,在当读取到所述目标行缓冲器对应的行尾结束标志时,读取所述目标行缓冲器中存储的数据,并写入输出缓冲器之后,从所述目标行缓冲器开始,滚筒往下移动所述读命令产生的行间隔。

为实现上述目的,本申请实施例还提供了一种电子设备,包括处理器和机器可读存储介质,所述机器可读存储介质存储有能够被所述处理器执行的机器可执行指令,所述处理器被所述机器可执行指令促使:实现上述图像旋转方法的任一步骤。

为实现上述目的,本申请实施例还提供了一种机器可读存储介质,存储有机器可执行指令,在被处理器调用和执行时,所述机器可执行指令促使所述处理器:实现上述图像旋转方法的任一步骤。

本申请实施例提供的图像旋转方法及装置中,将原始图像进行分块,得到多个图像块,将多个图像块写入内存中。之后,从多个图像块中确定目标图像块,从内存中读取目标图像块,将目标图像块中第二参考坐标对应的目标坐标处的像素点写入输出缓冲器。可见,本申请实施例中,只需向内存中写入一次,从内存中读出一次就可以完成图像旋转,减少了数据总线的占用时间,降低了内存带宽的浪费。当然,实施本申请的任一产品或方法必不一定需要同时达到以上所述的所有优点。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例提供的图像旋转方法的第一种流程示意图;

图2a、2b、2c为本申请实施例提供的原始图像分块的一种示意图;

图3a、3b为本申请实施例提供的图像子块的一种示意图;

图4为本申请实施例提供的图像块与旋转裁剪框的一种示意图;

图5为本申请实施例提供的图像块与旋转裁剪框的另一种示意图;

图6为本申请实施例提供的图像子块的另一种示意图;

图7为本申请实施例提供的行buffer的一种示意图;

图8为本申请实施例提供的图像块与旋转裁剪框的另一种示意图

图9为本申请实施例提供的滚筒式行buffer的一种示意图;

图10为本申请实施例提供的模块总体架构的一种示意图;

图11为本申请实施例提供的图像旋转方法的第二种流程示意图;

图12为本申请实施例提供的读命令产生的一种流程示意图;

图13为本申请实施例提供的图像块的扫描顺序的一种示意图;

图14为本申请实施例提供的图像旋转装置的一种结构示意图;

图15为本申请实施例提供的电子设备的一种结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

目前,图像的旋转过程包括:对图像进行分块,得到多个图像块,将图像块写入输入缓存中;从输入缓存中读取所有的图像块进行旋转,得到旋转图像块;将旋转图像块写入输出缓存中。上述输入缓存和输出缓存属于内存,旋转图像需要向内存中写入两次数据,从内存中读出一次数据。这使得数据总线的占用时间较长,进而导致内存带宽的浪费。

为了减少数据总线的占用时间,降低内存带宽的浪费,本申请实施例提供了一种图像旋转方法。该方法中,对原始图像进行分块,得到多个图像块;将多个图像块写入内存中;每一图像块中包括多个图像子块;确定多个图像块中旋转裁剪框覆盖的图像块,作为目标图像块;对于目标图像块中每一像素点,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标;原始坐标系为原始图像的坐标系,旋转坐标系为旋转图像的坐标系;确定多个第一参考坐标在旋转坐标系下的多个目标坐标;对于每一目标坐标,将该目标坐标转换为原始坐标系下的第二参考坐标;对于每一第二参考坐标,若该第二参考坐标所在的图像子块与该第二参考坐标对应的原始坐标所在的图像子块相同,则采用插值算法,计算该第二参考坐标对应的目标坐标处像素点的像素值,并将该第二参考坐标对应的目标坐标处的像素点写入输出缓冲器。

本申请实施例提供的技术方案中,在将图像块写入内存后,从内存中读取出图像块做旋转后,将旋转后的图像块写入输出缓冲器。可见,只需向内存中写入一次,从内存中读出一次就可以完成图像旋转,减少了数据总线的占用时间,降低了内存带宽的浪费。

下面通过具体实施例对,本申请进行具体说明。

参考图1,图1为本申请实施例提供的图像旋转方法的第一种流程示意图。该方法包括如下步骤。

步骤101,对原始图像进行分块,得到多个图像块。

本申请实施例中,上述原始图像可以为摄像机采集的一张图像,也可以为摄像机采集的视频中的一个视频帧。原始图像可以yuv422格式的图像,也可以为yuv444格式的图像,还可以为rgb格式的图像。原始图像也可以为其他格式的图像,本申请实施例对此不进行限定。

一种可选的实施方式中,在获取到原始图像后,对原始图像进行分块,得到多个分割块;在每个分割块的第一侧拼接一行像素点,并在每个分割块的第二侧拼接一列像素点,得到多个图像块,第一侧为上侧或下侧,第二侧为左侧或右侧。

例如,第一侧为下侧,第二侧为右侧,分割块的尺寸为7*7(像素点)。如图2a、2b和2c所示原始图像。图2a、2b和2c中,每一圆点代表一个像素点。对图2a所示的原始图像进行分块,得到多个分割块,如图2b所示。在每个分割块的下侧拼接一行像素点,并在每个分割块的右侧拼接一列像素点,得到多个图像块,如图2c所示的图像块a、b、c和d。图2c中,每个图像块右侧灰色的一列为该图像块拼接的一列像素点,下侧灰色的一行,为该图像块拼接为该图像块拼接的一行像素点

本申请实施例中,对原始图像直接进行分割,得到分割块之间存在拼接缝。如图2b所示。在每个分割块的第一侧拼接一行像素点,并在每个分割块的第二侧拼接一列像素点,得到多个图像块。这样,消除了图像块间的拼接缝,旋转图像中的像素点必然会落在一个图像块中。

若旋转图像中的像素点落在如图2b所示的拼接缝处,则在确定落在拼接缝处的像素点的像素时,只需要从内存中定位出一个图像块就可以完成图像块内的像素点的坐标变换和插值操作等。这里,不需要从内存中定位出左右两个图像块、或上下两个图像块、或周边四个图像块所在位置,减少了缓存之前到来的内存数据的缓存空间。同时,减少了处理器一拍时间内完成的图像块地址到数据缓存地址的计算量,降低了逻辑资源和开发难度,利于问题的定位和代码的维护。

一种可选的实施方式中,在原始图像的行尾和/或帧尾进行图像填充,得到目标图像;目标图像的尺寸能被预设图像块尺寸整除。对目标图像进行分块,得到多个图像块。以便于得到尺寸相同的多个图像块。

例如,分割块的尺寸为7*7(像素点),则预设图像块尺寸为8*8(像素点)。原始图像的尺寸为1366*768(像素点)。1366除以8等于1360余6,768除以8等于96。为保证目标图像的尺寸能被预设图像块尺寸整除,则在原始图像的帧尾填充8-6=2行像素点,得到尺寸为1368*768(像素点)的目标图像。该图像能被8*8(像素点)整除。

步骤102,将多个图像块写入内存中;每一图像块中包括多个图像子块。

本申请实施例中,按照分块顺序,将得到的图像块连续的写入内存中。仍以图2c为例进行说明。对原始图像块分块时,从原始图像的左上角开始,对原始图像进行分块,得到8*8的图像块a,将图像块a写入内存中。之后,对原始图像进行分块,得到8*8的图像块b,将8*8的图像块b写入内存中。再之后,对原始图像进行分块,得到8*8的图像块c,将8*8的图像块c写入内存中。最后,对原始图像进行分块,得到8*8的图像块d,将8*8的图像块d写入内存中。分块写内存,可以保证读内存的最小包大小为一个图像块的大小,避免了大量的无效数据的读取,可有效地提高读内存的效率。

本申请实施例中,每一图像块中包括多个图像子块。图像子块的尺寸可以根据用户需求进行设定。例如,图像子块的尺寸为2*2(像素点),如图3a所示,每一虚线框表示一个图像子块。再例如,图像子块的尺寸为3*3(像素点),如图3b所示,每一虚线框表示一个图像子块。

本申请实施例中,内存可以为ddr(doubledatarata,双倍速率)同步动态随机存储器。

步骤103,确定多个图像块中旋转裁剪框覆盖的图像块,作为目标图像块。

其中,旋转裁剪框用于限定旋转图像的范围。具体的,裁剪旋转裁剪框覆盖的图像区域,即为旋转图像的区域。目标图像块为一部分区域或全部区域被旋转裁剪框覆盖的图像块。目标图像块可以为一个或多个。

例如,如图4所示的图像块与旋转裁剪框的示意图。图4中实线矩形框表示图像块,虚线矩形框表示旋转裁剪框。图4中,旋转裁剪框覆盖了图像块a-m这13个图像块,则可将图像块a-m这13个图像块均作为目标图像块。

一个可选的实施例中,目标图像块的确定过程可以包括如下步骤。

步骤1031,获取旋转裁剪框的旋转参数。

其中,旋转参数可以包括旋转裁剪框的起点在原始坐标系下的坐标。旋转裁剪框的起点为旋转图像的第一个有效像素点。原始坐标系为原始图像的坐标系,旋转坐标系为旋转图像的坐标系。如图5所示的图像块与旋转裁剪框的示意图。x1-y1坐标系为原始坐标系,o1为原始坐标系的起点。x2-y2坐标系为旋转坐标系,o2为旋转坐标系的起点坐标,也就是o2为旋转裁剪框的起点。o2在x1-y1坐标系下的中坐标为一旋转参数。

旋转参数还可以包括旋转裁剪框的旋转角度。转裁剪框的旋转角度为旋转图像的第一行像素点的矢量与原始坐标系x轴的夹角。如图5所示的角θ。

旋转参数还可以包括旋转裁剪框的宽高。如图5所示的旋转裁剪框的宽d,旋转裁剪框的高h。为便于后续计算,旋转裁剪框的宽高的单位与原始坐标系的单位一致。

一个实施例中,上述旋转参数可以为用户通过设备的配置接口配置的。

步骤1032,根据旋转参数,将旋转裁剪框中像素点在旋转坐标系下的旋转坐标,转换为原始坐标系下的第三参考坐标。

本申请实施例中,可按照旋转图像中像素点的显示顺序,将旋转裁剪框中每个像素点的旋转坐标转换为第三参考坐标。第三参考坐标可以为整数坐标,也可以为小数坐标。本申请实施例中,支持小数坐标的像素点,可以实现多个旋转图像拼接时拼接缝不可见。为了进一步实现多个旋转图像拼接时拼接缝不可见,多个旋转图像位于一个起点坐标相同的旋转坐标系中,相邻两个旋转图像间在旋转坐标系中间隔1个像素点的距离,多个旋转图像的旋转角度相同或多个旋转图像间旋转角度的差值为90°的整数倍。

一个可选的实施例中,对于旋转裁剪框中的每一像素点,可利用以下公式(1)和(2),将该像素点在旋转坐标系下的旋转坐标,转换为原始坐标系下的第三参考坐标:

src_x=src_x_strat+dst_x*cosθ-dst_y*sinθ(1)

src_y=src_y_start+dst_x*sinθ+dst_y*cosθ(2)

其中,dst_x为该像素点的旋转坐标的横坐标,dst_y为该像素点的旋转坐标的纵坐标,src_x为第三参考坐标的横坐标,src_y为第三参考坐标的纵坐标,θ为旋转裁剪框的旋转角度,src_x_start为旋转裁剪框的起点在原始坐标系下的横坐标,src_y_start为旋转裁剪框的起点在原始坐标系下的纵坐标。

例如,(src_x_start,src_y_start)为(10,15),θ为30°。若一像素点p1的(dst_xp1,dst_yp1)为(1,2),则根据公式(1)和(2)可确定像素点p1的第三参考坐标(src_xp1,src_yp1):

src_xp1=10+1*cos30°-2*sin30°=9.866;

src_yp1=15+1*sin30°+2*cos30°=17.232。

另一个可选的实施例中,对于旋转裁剪框中的每一像素点,可利用以下公式(3)和(4),将该像素点在旋转坐标系下的旋转坐标,转换为原始坐标系下的第三参考坐标:

src_x=α+src_x_strat+dst_x*cosθ-dst_y*sinθ(3)

src_y=β+src_y_start+dst_x*sinθ+dst_y*cosθ(4)

其中,dst_x为该像素点的旋转坐标的横坐标,dst_y为该像素点的旋转坐标的纵坐标,src_x为第三参考坐标的横坐标,src_y为第三参考坐标的纵坐标,θ为旋转裁剪框的旋转角度,src_x_start为旋转裁剪框的起点在原始坐标系下的横坐标,src_y_start为旋转裁剪框的起点在原始坐标系下的纵坐标,α和β为预设参数。

上述公式(1)、(2)、(3)和(4)中的正弦和余弦函数可以通过cordic、查表、控制单元等方式计算得到,且每帧原始图像只需要计算一次。即便使用查表法,消耗一个36kbram,精度就可以达到0.1度。计算获得的目标像素坐标一般为非整数坐标,由于图像分块时扩展的拼接缝均在x轴和y轴的正方向,所以对非整数坐标进行向下取整,确定整数坐标

步骤1033,将第三参考坐标所在的图像块作为目标图像块。

仍以步骤1033中的例子进行说明。像素点p1的第三参考坐标(src_xp1,src_yp1)为(9.866,17.232)。若一图像块1在原始坐标系下的坐标为:(5,15)-(10,20),(9.866,17.232)在(5,15)-(10,20)范围内,则可确定像素点p1所在的图像块为图像块1,将图像块1作为目标图像块。

本申请实施例中,每将旋转图像中一个像素点的旋转坐标转换为第三参考坐标,即可将该第三参考坐标所在的图像块作为目标图像块,以进行后续操作。而对于非目标图像块,则不需要将从内存中读出,节约了写带宽。

步骤104,对于目标图像块中的每一像素点,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标。其中,原始坐标系为原始图像的坐标系,旋转坐标系为旋转图像的坐标系。

在确定目标图像块后,对目标图像块中的每一像素点进行正向坐标变换,也就是,对于目标图像块中的每一像素点,将目标图像块中的每一像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标。

一个可选的实施例中,对于目标图像块中的每一像素点,可利用以下公式(5)和(6),进行正向坐标变换,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标:

dst_x′=(src_x′-src_x_start)*cosθ+(src_y′-src_y_start)*sinθ(5)

dst_y′=(src_x′-src_x_start)*sinθ-(src_y′-src_y_start)*cosθ(6)

其中,dst_x'为第一参考坐标的横坐标,dst_y'为第一参考坐标的纵坐标,src_x'为原始坐标的横坐标,src_y'为原始坐标的纵坐标,θ为旋转裁剪框的旋转角度,src_x_start为旋转裁剪框的起点在原始坐标系下的横坐标,src_y_start为旋转裁剪框的起点在原始坐标系下的纵坐标。

例如,(src_x_start,src_y_start)为(10,15),θ为30°。若一像素点p2的(src_x'p2,src_y'p2)为(12,18),则根据公式(3)和(4),可确定像素点p2的第一参考坐标(dst_x'p2,dst_y'p2):

dst_x'p2=(12-10)*cos30°+(18-15)*sin30°=3.232;

dst_y'p2=(12-10)*sin30°+(18-15)*cos30°=3.598。

另个可选的实施例中,对于目标图像块中的每一像素点,可利用以下公式(7)和(8),进行正向坐标变换,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标:

dst_x′=α′+(src_x′-src_x_start)*cosθ+(src_y′-src_y_start)*sinθ(7)

dst_y′=β′+(src_x′-src_x_start)*sinθ-(src_y′-src_y_start)*cosθ(8)

其中,dst_x'为第一参考坐标的横坐标,dst_y'为第一参考坐标的纵坐标,src_x'为原始坐标的横坐标,src_y'为原始坐标的纵坐标,θ为旋转裁剪框的旋转角度,src_x_start为旋转裁剪框的起点在原始坐标系下的横坐标,src_y_start为旋转裁剪框的起点在原始坐标系下的纵坐标,α'和β'为预设参数。

一个可选的实施例中,为节约计算资源,可以以图像子块为单位,将像素点的原始坐标转换为第一参考坐标。例如,若目标图像块中一图像子块的一部分区域或全部区域被旋转裁剪框覆盖,则对于该图像子块中的每一像素点,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标。

步骤105,确定多个第一参考坐标在旋转坐标系下的多个目标坐标。

本申请实施例中,目标坐标为位于旋转裁剪框内或边界上的坐标。在旋转图像中像素点位于整数坐标处。在将原始图像中像素点的原始坐标转换为旋转坐标系下的第一参考坐标后,确定每一第一参考坐标在旋转坐标系下对应的整数坐标,得到多个目标坐标。

一个可选的实施例中,在得到多个第一参考坐标后,对于每一第一参考坐标,对该第一参考坐标向上取整和向下取整,得到目标坐标。例如,得到第一参考坐标(3.232,3.598),对该第一参考坐标向上取整和向下取整,得到目标坐标为:(3,3),(3,4),(4,3),(4,4)。

一个可选的实施例中,以图像子块为单位,确定多个第一参考坐标在旋转坐标系下的多个目标坐标。具体地,对于每一第一参考坐标,对该第一参考坐标向上取整和向下取整,得到该第一参考坐标对应的过渡坐标。对于位于同一图像子块的多个第一参考坐标,将这多个第一参考坐标对应的过渡坐标中重复次数大于等于预设次数阈值的过渡坐标,以及这多个第一参考坐标为整数第一参考坐标,确定为目标坐标。

例如,如图6所示的图像子块示意图。图6中,实线框为旋转图像的图像子块,虚线框为原始图像的图像子块。进行正向坐标变换,得到a1-4这4个第一参考坐标。

对第一参考坐标a1向上取整和向下取整,得到第一参考坐标a1对应的过渡坐标b1、b2、b5和b6。

对第一参考坐标a2向上取整和向下取整,得到第一参考坐标a2对应的过渡坐标b2、b3、b6和b7。

对第一参考坐标a3向上取整和向下取整,得到第一参考坐标a3对应的过渡坐标b7、b8、b11和b12。

对第一参考坐标a4向上取整和向下取整,得到第一参考坐标a4对应的过渡坐标b6、b7、b10和b11。

其中,b1的重复次数为1,b2的重复次数为2,b3的重复次数为1,b4的重复次数为0,b5的重复次数为1,b6的重复次数为3,b7的重复次数为3,b8的重复次数为1,b9的重复次数为0,b10的重复次数为1,b11的重复次数为2,b12的重复次数为1。若预设次数阈值为3,可确定b6和b7为目标坐标。

本申请实施例中,以图像子块为单位,确定多个第一参考坐标在旋转坐标系下的多个目标坐标,对于位于同一图像子块的多个第一参考坐标,将重复次数大于等于预设次数阈值的过渡坐标作为目标坐标,而对于重复次数小于预设次数阈值的过渡坐标,在其他图像块中也会是重复次数大于等于预设次数阈值的过渡坐标。因此,以图像子块为单位,确定多个第一参考坐标在旋转坐标系下的多个目标坐标,减少了参与后续处理中重复的目标坐标的数量,提高了计算效率。

一个可选的实施例中,图像块的第一侧边界为拼接的一行像素点,图像块的第二侧边界为拼接的一列像素点。一图像块的第一侧边界和第二侧边界必然为其他图像块的边界。如,第一侧为下侧,第二侧为右侧,则一图像块的下侧边界必然为其他图像块的上侧边界,一图像块的右侧边界必然为其他图像块的左侧边界。在确定多个第一参考坐标在旋转坐标系下的多个目标坐标时,可将重复次数大于等于预设次数阈值的过渡坐标作为目标坐标,或者将图像子块中不在第一侧边界和第二侧边界上且为整数的第一参考坐标,确定为目标坐标。这样,可进一步减少了参与后续处理中重复的目标坐标的数量,提高计算效率。

步骤106,对于每一目标坐标,将该目标坐标转换为原始坐标系下的第二参考坐标。

对于每一目标坐标进行反向坐标变换,也就是,将每一目标坐标转换为原始坐标系下的第二参考坐标。

一个可选的实施例中,对于每一目标坐标,利用以下公式(9)和(10)进行反向坐标变换,将该目标坐标转换为原始坐标系下的第二参考坐标:

src_x″=src_x_strat+dst_x″*cosθ-dst_y″*sinθ(9)

src_y″=src_y_start+dst_x″*sinθ+dst_y″*cosθ(10)

其中,dst_x”为目标坐标的横坐标,dst_y”为目标坐标的纵坐标,src_x”为第二参考坐标的横坐标,src_y”为第二参考坐标的纵坐标,θ为旋转裁剪框的旋转角度,src_x_start为旋转裁剪框的起点在原始坐标系下的横坐标,src_y_start为旋转裁剪框的起点在原始坐标系下的纵坐标。

另一个可选的实施例中,对于每一目标坐标,利用以下公式(11)和(12)进行反向坐标变换,将该目标坐标转换为原始坐标系下的第二参考坐标:

src_x″=α″+src_x_strat+dst_x″*cosθ-dst_y″*sinθ(11)

src_y″=β″+src_y_start+dst_x″*sinθ+dst_y″*cosθ(12)

其中,dst_x”为目标坐标的横坐标,dst_y”为目标坐标的纵坐标,src_x”为第二参考坐标的横坐标,src_y”为第二参考坐标的纵坐标,θ为旋转裁剪框的旋转角度,src_x_start为旋转裁剪框的起点在原始坐标系下的横坐标,src_y_start为旋转裁剪框的起点在原始坐标系下的纵坐标,α”和β”为预设参数。

对于公式(9)、(10)、(11)和(12),可参考上述公式(1)、(2)、(3)和(4)部分的描述。

步骤107,对于每一第二参考坐标,若该第二参考坐标所在的图像子块与该第二参考坐标对应的原始坐标所在的图像子块相同,则采用插值算法,计算该第二参考坐标对应的目标坐标处像素点的像素值,并将该第二参考坐标对应的目标坐标处的像素点写入输出缓冲器。

在得到第二参考坐标,判断该第二参考坐标所在的图像子块与该第二参考坐标对应的原始坐标所在的图像子块是否相同。若相同,则采用插值算法,计算该第二参考坐标对应的目标坐标处像素点的像素值,并将该第二参考坐标对应的目标坐标处的像素点写入输出缓冲器。若不同相同,则结束处理。

例如,图像子块11中像素点q1的原始坐标q1。对原始坐标q1进行正向坐标变换后,得到目标坐标q21、q22、q23和q24。对目标坐标q21进行反向坐标变换后,得到第二参考坐标q11;对目标坐标q22进行反向坐标变换后,得到第二参考坐标q12;对目标坐标q23进行反向坐标变换后,得到第二参考坐标q13;对目标坐标q24进行反向坐标变换后,得到第二参考坐标q14。若q11在图像子块11中,q22、q23和q24不在图像子块11中,则采用插值算法,计算q11对应的q21处像素点的像素值,将q21处的像素点写入输出缓冲器。

本申请实施例中,上述插值算法可以为双线性插值算法,也可为双三次插值算法,还可以为其他插值算法。对此不做限定。

一个可选的实施例中,对于每一第二参考坐标,将该第二参考坐标对应的目标坐标处的像素点写入输出缓冲器的流程,可以包括如下步骤。

步骤1071,确定该第二参考坐标对应的目标坐标处的像素点,在旋转图像中的目标像素行和目标位置。

例如,旋转图像的尺寸为10*20,若第二参考坐标对应的目标坐标为(2,15),则可确定该第二参考坐标对应的目标坐标处的像素点,则在旋转图像中的目标像素行为2,目标位置为第15个像素点。

步骤1072,根据目标像素行和目标位置,从预设行缓冲器中确定该第二参考坐标对应的目标坐标处的像素点对应的目标行缓冲器,以及该第二参考坐标对应的目标坐标处的像素点在目标行缓冲器中的缓存地址。

本申请实施例中,预先设置多个行buffer(缓冲器),每一行buffer对应旋转图像的一个像素行,像素行中的每一像素点在行buffer存在对应的缓存地址。例如,如图7所示,包括3个行buffer,行buffer1对应旋转图像的像素行1,行buffer2对应旋转图像的像素行2,行buffer3对应旋转图像的像素行3。

一个示例中,为节约资源,可采用滚筒式行buffer。滚筒式行buffer的工作原理为:确定一行buffer对应的像素行,向该行buffer写入对应的像素行的像素点,在写完成后,将该行buffer中写入的像素点写入输出缓冲器,之后,清除该行buffer,重新确定该行buffer对应的像素行。

一个可选的实施例中,为节约内存带宽资源,对图像块的斜对角线的长度值向上取整,基于该取整得到的值确定为滚筒式行buffer中行buffer的个数,保证从内存中读取出一个图像块中,位于该图像块中旋转图像的像素点可以一次写入滚筒式行buffer中。例如,如图8所示的图像块与旋转裁剪框的示意图。图8中,实线框为图像块,尺寸为8*8,虚线框为旋转裁剪框。从图8中可得到,旋转裁剪框的旋转角度为45时,图像块占用的像素行数最多,为7*√2=9.899行,即为10行。滚筒式行buffer中行buffer的个数小于10。

一个示例中,为实现乒乓缓存,每一轮乒乓的行数需要与读命令产生的行间隔保持一致,基于图像块的斜对角线的长度值与读命令产生的行间隔,确定滚筒式行buffer中行buffer的个数。例如,读命令产生的行间隔为2。对于图8所示的图像块与旋转裁剪框的情况,需要设置至少10+2=12个行buffer,如设置13个行buffer,如图9所示。图9中,实线框为旋转裁剪框,虚线框为图像块。实心圆点为旋转裁剪框中像素点,且在读取到该图像块后需要计算并写入滚筒式行buffer中的像素点。在读取行buffer0-1时,写入行2-12。在读行buffer0-1之后,进行滚筒操作,滚筒往下移动2行,读取行buffer2-3,写入行buffer4-13,和行0。其中,行buffer0重新确定了对应的像素行。

步骤1073,将该第二参考坐标对应的目标坐标处的像素点写入目标行缓冲器的缓存地址处。

一个可选的实施例中,为了保证写入输出缓冲器的完整,在将该第二参考坐标对应的目标坐标处的像素点写入目标行缓冲器的缓存地址处之前,向目标行缓冲器中写入背景色。这样,在目标行缓冲器对应的像素行中存在无效区间的情况下,也可以输出完整的一行像素点。在后续将目标缓冲器中的像素点写入输出缓冲器后,重新向目标行缓冲器中写入背景色。

其中,一像素行的无效区间为位于该像素行中位于无效区域的部分。例如,如图4中上方的灰色区域,该灰色区域为旋转图像的一部分,但这部分位于原始图像外,因此该部分为无效区域。旋转图像的中一像素行位于该灰色区域的部分为该像素行的无效区间。

步骤1074,当读取到目标行缓冲器对应的行尾结束标志时,读取目标行缓冲器中存储的数据,并写入输出缓冲器。

在将旋转图像的所有像素行,从行缓冲器写入输出缓冲器后,可以从输出缓冲器中读取并显示完整的旋转图像。

本申请实施例提供的技术方案中,将原始图像进行分块,得到多个图像块,将多个图像块写入内存中。之后,从多个图像块中确定目标图像块,从内存中读取目标图像块,将目标图像块中第二参考坐标对应的目标坐标处的像素点写入输出缓冲器。也就是,只需向内存中写入一次,从内存中读出一次,后续的图像旋转在缓冲器间执行即可,减少了数据总线的占用时间,降低了内存带宽的浪费。

另外,通过本申请实施例提供的技术方案,可以实现任意角度,任意大小(最大4kp60),任意起点(-8191~8191)的图像旋转,支持图像镜像输出,无效图像区域填充背景色。

基于上述图像旋转方法,本申请实施例提供了一种模块总体架构示意图,如图10所示,包括:图像扩展模块200、图像分块模块210、写内存模块220、内存230、旋转参数配置模块240、坐标变换模块250、读命令产生模块260、数据buffer270、正向坐标变换模块280、反向坐标变换模块290、插值模块211、行buffer212和输出buffer213。基于模块总体架构,对本申请实施例提供的图像旋转方法的处理流程进行说明,具体的,参考图11所示的图像旋转方法的第二种流程示意图,方法包括如下步骤:

步骤1101,图像扩展模块200对输入的原始图像进行图像扩展,即在原始图像的行尾和/或帧尾进行图像填充。

步骤1102,图像分块模块210对图像扩展后的原始图像进行分块,得到多个分割块;在每个分割块的第一侧拼接一行像素点,并在每个分割块的第二侧拼接一列像素点,得到多个图像块。为便于描述,下面均以第一侧为下侧,第二侧为右侧为例进行说明。

步骤1103,写内存模块220按照分块顺序,将图像块连续写入内存230中。

步骤1104,旋转参数配置模块240获取用户配置的旋转参数。旋转参数可以包括旋转裁剪框的起点在原始坐标系下的坐标,旋转裁剪框的旋转角度,旋转裁剪框的宽高。

步骤1105,坐标变换模块250根据旋转参数,将旋转裁剪框中像素点在旋转坐标系下的旋转坐标,转换为原始坐标系下的第三参考坐标,将第三参考坐标所在的图像块作为目标图像块,计算出目标图像块在内存中的目标地址。

步骤1106,读命令产生模块260生成针对目标地址的读命令。

一个可选的实施例中,对于读命令的产生可参考图12,包括如下步骤。

步骤1201,接收一帧原始图像的图像块写内存完成命令或刷新显示命令。

步骤1202,更新旋转参数,初始化读命令查找表。其中,读命令查找表中记录有图像块的地址与已读标识的对应关系,或该图像块的地址与未读标识的对应关系。

步骤1203,根据图像块的显示刷新顺序,以及读命令产生行间隔,对旋转裁剪框中像素点的旋转坐标进行坐标变换,获得该像素点在原始图像中的位置坐标。

本申请实施例中,读命令产生行间隔可根据实际需要设定。例如,读命令产生行间隔可以为2、3等。

步骤1204,判断该像素点的位置坐标是否在原始图像的有效像素点的坐标范围内。如果是,则执行步骤1205。如果否,则不发送读命令,结束本次处理。

步骤1205,若该像素点的位置坐标为小数点坐标,则进行向下取整,然后根据取整的位置坐标,计算该像素点对应的图像块号和该图像块的地址。

步骤1206,查找读命令查找表中该图像块的地址是否被标记为已读。如果否,则执行步骤1207。如果是,则执行步骤1208。

步骤1207,将针对该图像块的读命令送入输出缓存,并更新读命令查找表,即将读命令查找表该图像块的地址标记为已读。这可以用于平滑读命令和时钟域转换。

步骤1208,检测旋转裁剪框中一行像素点的读命令产生是否已完成。如果是,则执行步骤1209。如果否,则继续执行步骤1203。

步骤1209,向图像旋转模块发送行尾结束命令。该行尾结束命令用于标识一行像素点的结束,启动该行像素点的旋转结果的输出。图像旋转模块包括正向坐标变换模块280、反向坐标变换模块290、插值模块211和行buffer212等。

由于图像旋转后每行的像素点数量不一致,向图像旋转模块发送行尾结束命令,便于图像旋转模块知悉何时为一行像素点的结尾。

步骤1210,检测该原始图像的所有命令是否都已产生,也就是,检测该行像素点是否为最后一行像素点。如果是,则返回idle状态,等待下一帧原始图像的图像块写内存完成命令或刷新显示命令,继续执行步骤1201。如果否,则继续执行步骤1203。

步骤1107,数据buffer270基于读命令从内存中读取图像块,存储在数据buffer270中。

一个可选的实施例中,内存中存储的图像块的图像格式可以为yuv422、yuv444或rgb。基于读命令从内存中读取图像块时,首先将图像块的格式统一到yuv444或者rgb格式,然后使用位宽转换模块转换为96bit的数据,当检测到内存中有一个完整图像块时,从内存中取出图像块送入数据buffer270。根据读内存顺序完成,每个图像块内需要完成各图像子块的计算,每个图像子块需要完成该图像子块内的旋转坐标像素点的产生。

例如,位宽转换模块输出的带宽为每拍4个像素点,图像块的尺寸为2*2,即后续坐标变换每个像素点需要计算一个2*2的图像块。对于一个8*8的图像块可按照图13所示的图像块的扫描顺序进行扫描,总共需要计算49个2x2的图像子块,使用数据buffer270来进行位宽转换和乒乓操作。

步骤1108,正向坐标变换模块280计算目标图像块中各有效像素点的原始坐标,丢弃无效像素点。其中,对于目标图像块中每一图像子块,若旋转裁剪框覆盖该图像子块的一部分或全部,则该有效像素点。否则为无效像素点。

步骤1109,正向坐标变换模块280对于目标图像块中的每一像素点,根据旋转参数对该像素点的坐标进行正向坐标变换,即将该像素点在原始坐标系下的原始坐标转换为旋转坐标系下的第一参考坐标。

步骤1110,正向坐标变换模块280对于每一第一参考坐标,对该第一参考坐标向上取整和向下取整,得到该第一参考坐标对应的4个目标坐标。

步骤1111,反向坐标变换模块290对于每一目标坐标,根据旋转参数对该目标坐标进行反向坐标变换,即将该目标坐标转换为原始坐标系下的第二参考坐标。

步骤1112,插值模块211对于每一第二参考坐标,判断该第二参考坐标所在的图像子块与该第二参考坐标对应的原始坐标所在的图像子块是否相同。若相同,则执行步骤1113。若不同,则执结束处理。

步骤1113,插值模块211采用插值算法,计算该第二参考坐标对应的目标坐标处像素点的像素值。

步骤1114,插值模块211确定该第二参考坐标对应的目标坐标处的像素点,在旋转图像中的目标像素行和目标位置;根据目标像素行和目标位置,确定该第二参考坐标对应的目标坐标处的像素点对应的目标行buffer,以及该第二参考坐标对应的目标坐标处的像素点在目标行buffer中的缓存地址;将该第二参考坐标对应的目标坐标处的像素点写入目标行buffer的缓存地址处。

本申请的一个实施例中,在向目标行buffer中写入像素点前,对目标行buffer进行初始化,向目标行buffer中写入背景色。在目标行buffer可写的情况下,向目标行buffer写入数据。

步骤1115,插值模块211判断是否读取到原始图像的帧尾结束标志。若否,则执行步骤1116。若是,则等待下一帧原始图像,重新执行步骤1101。

步骤1116,插值模块211判断是否读取到目标行buffe对应的行尾结束标志。如果否,则执行步骤1107,继续从内存中读取目标图像块。如果是,返回执行步骤1107,并执行步骤1117。

步骤1117,从目标行buffer中读取或镜像读取数据。

步骤1118,清除目标行buffer。

具体的,目标行buffer的处理流程,可以参考上述滚筒式行buffer的处理流程。

步骤1119,将从目标行buffer中读取到的数据,写入输出buffer213。

步骤1120,在旋转图像的所有像素行的数据均写入输出buffer213后,从输出buffer213中读取旋转图像。

与上述图像旋转方法实施例对应,本申请实施例还提供了一种图像旋转装置。参考图14,图14为本申请实施例提供的图像旋转装置的一种结构示意图,该装置包括:

分块模块1401,用于对原始图像进行分块,得到多个图像块;

第一写入模块1402,用于将多个图像块写入内存中;每一图像块中包括多个图像子块;

第一确定模块1403,用于确定多个图像块中旋转裁剪框覆盖的图像块,作为目标图像块;

第一转换模块1404,用于对于目标图像块中的每一像素点,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标;原始坐标系为原始图像的坐标系,旋转坐标系为旋转图像的坐标系;

第二确定模块1405,用于确定多个第一参考坐标在旋转坐标系下的多个目标坐标;

第二转换模块1406,用于对于每一目标坐标,将该目标坐标转换为原始坐标系下的第二参考坐标;

计算模块1407,用于对于每一第二参考坐标,若该第二参考坐标所在的图像子块与该第二参考坐标对应的原始坐标所在的图像子块相同,则采用插值算法,计算该第二参考坐标对应的目标坐标处像素点的像素值,并将该第二参考坐标对应的目标坐标处的像素点写入输出缓冲器。

一个可选的实施例中,分块模块1401,具体可以用于:

对原始图像进行分块,得到多个分割块;

在每个分割块的第一侧拼接一行像素点,并在每个分割块的第二侧拼接一列像素点,得到多个图像块,第一侧为上侧或下侧,第二侧为左侧或右侧。

一个可选的实施例中,分块模块1402,具体可以用于:

在原始图像的行尾和/或帧尾进行图像填充,得到目标图像;目标图像的尺寸能被预设图像块尺寸整除;

对目标图像进行分块,得到多个图像块。

一个可选的实施例中,第一确定模块1403,具体可以用于:

获取旋转裁剪框的旋转参数;旋转参数包括旋转裁剪框的起点在原始坐标系下的坐标,旋转裁剪框的旋转角度,以及旋转裁剪框的宽高;

根据旋转参数,将旋转裁剪框中像素点在旋转坐标系下的旋转坐标,转换为原始坐标系下的第三参考坐标;

将第三参考坐标所在的图像块作为目标图像块。

一个可选的实施例中,第一转换模块1404,具体可以用于:

对于目标图像块中的每一像素点,利用以下公式,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标:

dst_x′=(src_x′-src_x_start)*cosθ+(src_y′-src_y_start)*sinθ;

dst_y′=(src_x′-src_x_start)*sinθ-(src_y′-src_y_start)*cosθ;

其中,dst_x'为第一参考坐标的横坐标,dst_y'为第一参考坐标的纵坐标,src_x'为原始坐标的横坐标,src_y'为原始坐标的纵坐标,θ为旋转裁剪框的旋转角度,src_x_start为旋转裁剪框的起点在原始坐标系下的横坐标,src_y_start为旋转裁剪框的起点在原始坐标系下的纵坐标。

一个可选的实施例中,第二确定模块1405,具体可以用于:

对于每一第一参考坐标,对该第一参考坐标向上取整和向下取整,得到目标坐标。

一个可选的实施例中,第二确定模块1405,具体可以用于:

对于每一第一参考坐标,对该第一参考坐标向上取整和向下取整,得到该第一参考坐标对应的过渡坐标;

对于位于同一图像子块的多个第一参考坐标,将这多个第一参考坐标对应的过渡坐标中重复次数大于等于预设次数阈值的过渡坐标,以及这多个第一参考坐标为整数的第一参考坐标,确定为目标坐标。

一个可选的实施例中,第二转换模块1406,具体可以用于:

对于每一目标坐标,利用以下公式,将该目标坐标转换为原始坐标系下的第二参考坐标:

src_x″=src_x_strat+dst_x″*cosθ-dst_y″*sinθ;

src_y″=src_y_start+dst_x″*sinθ+dst_y″*cosθ;

其中,dst_x”为目标坐标的横坐标,dst_y”为目标坐标的纵坐标,src_x”为第二参考坐标的横坐标,src_y”为第二参考坐标的纵坐标,θ为旋转裁剪框的旋转角度,src_x_start为旋转裁剪框的起点在原始坐标系下的横坐标,src_y_start为旋转裁剪框的起点在原始坐标系下的纵坐标。

一个可选的实施例中,计算模块1407,具体可以用于:

确定该第二参考坐标对应的目标坐标处的像素点,在旋转图像中的目标像素行和目标位置;

根据目标像素行和目标位置,从预设行缓冲器中确定该第二参考坐标对应的目标坐标处的像素点对应的目标行缓冲器,以及该第二参考坐标对应的目标坐标处的像素点在目标行缓冲器中的缓存地址;

将该第二参考坐标对应的目标坐标处的像素点写入目标行缓冲器的缓存地址处;

当读取到目标行缓冲器对应的行尾结束标志时,读取目标行缓冲器中存储的数据,并写入输出缓冲器。

一个可选的实施例中,上述图像旋转装置还可以包括:第二写入模块,用于在将该第二参考坐标对应的目标坐标处的像素点写入目标行缓冲器的地址处之前,向目标行缓冲器中写入背景色。

一个可选的实施例中,预设行缓冲器为滚筒式行缓冲器;预设行缓冲器的个数根据图像块的斜对角线的长度值,以及读命令产生的行间隔所确定的。

一个可选的实施例中,上述图像旋转装置还可以包括:滚筒模块,在当读取到目标行缓冲器对应的行尾结束标志时,读取目标行缓冲器中存储的数据,并写入输出缓冲器之后,从目标行缓冲器开始,滚筒往下移动读命令产生的行间隔。

本申请实施例提供的图像旋转装置中,将原始图像进行分块,得到多个图像块,将多个图像块写入内存中。之后,从多个图像块中确定目标图像块,从内存中读取目标图像块,将目标图像块中第二参考坐标对应的目标坐标处的像素点写入输出缓冲器。可见,本申请实施例中,只需向内存中写入一次,从内存中读出一次就可以完成图像旋转,减少了数据总线的占用时间,降低了内存带宽的浪费。

与上述图像旋转方法实施例对应,本申请实施例还提供了一种电子设备,如图15所示,包括处理器1501和机器可读存储介质1502,机器可读存储介质1502存储有能够被处理器1501执行的机器可执行指令。处理器1501被机器可执行指令促使实现如下步骤:

对原始图像进行分块,得到多个图像块;

将多个图像块写入内存中;每一图像块中包括多个图像子块;

确定多个图像块中旋转裁剪框覆盖的图像块,作为目标图像块;

对于目标图像块中的每一像素点,将该像素点在原始坐标系下的原始坐标,转换为旋转坐标系下的第一参考坐标;原始坐标系为原始图像的坐标系,旋转坐标系为旋转图像的坐标系;

确定多个第一参考坐标在旋转坐标系下的多个目标坐标;

对于每一目标坐标,将该目标坐标转换为原始坐标系下的第二参考坐标;

对于每一第二参考坐标,若该第二参考坐标所在的图像子块与该第二参考坐标对应的原始坐标所在的图像子块相同,则采用插值算法,计算该第二参考坐标对应的目标坐标处像素点的像素值,并将该第二参考坐标对应的目标坐标处的像素点写入输出缓冲器。

本申请实施例提供的图像旋转装置中,将原始图像进行分块,得到多个图像块,将多个图像块写入内存中。之后,从多个图像块中确定目标图像块,从内存中读取目标图像块,将目标图像块中第二参考坐标对应的目标坐标处的像素点写入输出缓冲器。可见,本申请实施例中,只需向内存中写入一次,从内存中读出一次就可以完成图像旋转,减少了数据总线的占用时间,降低了内存带宽的浪费。

上述机器可读存储介质1502可以包括ram(randomaccessmemory,随机存取存储器),也可以包括nvm(non-volatilememory,非易失性存储器),例如至少一个磁盘存储器。另外,机器可读存储介质1502还可以是至少一个位于远离前述处理器的存储装置。

上述处理器1501可以是通用处理器,包括cpu(centralprocessingunit,中央处理器)、np(networkprocessor,网络处理器)等;还可以是dsp(digitalsignalprocessing,数字信号处理器)、asic(applicationspecificintegratedcircuit,专用集成电路)、fpga(field-programmablegatearray,现场可编程门阵列)或其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。

与上述图像旋转方法实施例对应,本申请实施例还提供了一种机器可读存储介质,其特征在于,存储有机器可执行指令,在被处理器调用和执行时,所述机器可执行指令促使所述处理器实现上述任一图像旋转方法步骤。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于图像旋转装置、电子设备和机器可读存储介质实施例而言,由于其基本相似于图像旋转方法实施例,所以描述的比较简单,相关之处参见图像旋转方法实施例的部分说明即可。

以上所述仅为本申请的较佳实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本申请的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1