CN104952038B - 一种基于sse2指令集的图像插值方法 - Google Patents

一种基于sse2指令集的图像插值方法 Download PDF

Info

Publication number
CN104952038B
CN104952038B CN201510301095.5A CN201510301095A CN104952038B CN 104952038 B CN104952038 B CN 104952038B CN 201510301095 A CN201510301095 A CN 201510301095A CN 104952038 B CN104952038 B CN 104952038B
Authority
CN
China
Prior art keywords
pixel
interpolation
neighborhood
component
current pixel
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201510301095.5A
Other languages
English (en)
Other versions
CN104952038A (zh
Inventor
张谱
路鹏
赵祖轩
王丽丽
周中亚
李润锋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
BEIJING IMAGE VISION TECHNOLOGY BRANCH CHINA DAHENG (GROUP) Co Ltd
BEIJING DAHENG IMAGE VISION Co Ltd
Original Assignee
BEIJING IMAGE VISION TECHNOLOGY BRANCH CHINA DAHENG (GROUP) Co Ltd
BEIJING DAHENG IMAGE VISION Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by BEIJING IMAGE VISION TECHNOLOGY BRANCH CHINA DAHENG (GROUP) Co Ltd, BEIJING DAHENG IMAGE VISION Co Ltd filed Critical BEIJING IMAGE VISION TECHNOLOGY BRANCH CHINA DAHENG (GROUP) Co Ltd
Priority to CN201510301095.5A priority Critical patent/CN104952038B/zh
Publication of CN104952038A publication Critical patent/CN104952038A/zh
Application granted granted Critical
Publication of CN104952038B publication Critical patent/CN104952038B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T3/00Geometric image transformation in the plane of the image
    • G06T3/40Scaling the whole image or part thereof
    • G06T3/4015Demosaicing, e.g. colour filter array [CFA], Bayer pattern

Abstract

本发明涉及一种基于SSE2指令集的图像插值方法,其包括:选择当前像素点,并将该当前像素点邻域的图像数据载入xmm寄存器;插值当前像素点邻域的GR行和BG行各像素点的G分量;输出插值后的G分量数据;基于插值出的G分量数据插值当前像素点邻域的GR行各像素点的B分量和R分量;基于插值出的G分量数据插值当前像素点邻域的BG行各像素点的B分量和R分量;输出插值后的BGR格式24位图像数据。本发明针对相机采集输出的Bayer格式Raw数据,基于SSE2指令集技术在一个指令执行周期中对多个像素点进行操作,减少了计算的复杂度,提高了整体处理效率,为其它针对图像的后处理留出更多的时间。

Description

一种基于SSE2指令集的图像插值方法
技术领域
本发明涉及图像插值技术领域,尤其涉及一种基于SSE2(Streaming SIMDExtensions 2nd,单指令多数据流扩展)指令集实现的Bayer格式图像插值方法。
背景技术
在工业相机领域,一般彩色相机采用单CCD(或者CMOS)成像单元进行成像,相机直接输出Bayer格式Raw数据。这些Bayer格式Raw数据是一幅典型的马赛克图像,每个像素点只含有单个通道的像素值,需对其进行插值(去马赛克)处理后,方才可以进行其它方面的应用。
通过图像插值处理可以实现图像的放大显示,提高了图像的分辨率。插值后的图像一方面可以带来愉悦的观感,另一方面还提供图像更多的纹理细节,这些细节对图像理解和图像分析具有重要的意义。但是由于硬件性能的限制,通过数字相机采集的图像往往达不到所需的分辨率,若从硬件上进行改进则需要付出高昂的成本,这是设备采购商很难承受的,而通过软件实现图像插值处理来弥补硬件的不足则较好地解决了这个问题。
线性插值方法是用来通过软件实现提高图像分辨率的典型图像插值处理方法。
常见的线性插值方法,如双线性插值或者三次样条插值,基于空间不变模型,计算简单,效率较高,但是插值后的图像边缘模糊且有锯齿现象,严重影响插值后图像的后处理操作。为了得到更好的插值图像,新的插值算法不断被提出。
S.Vinsley提出一种边缘自适应的图像插值方法,该算法充分考虑图像的纹理方向,根据当前插值像素点的邻域判断当前区域为边缘区域或者平坦区域,然后基于边缘的方向性采用邻域像素相关性和通道像素差分进行插值,本算法的放大效果优于传统的线性插值,但是相应的复杂程度也远高于传统的线性插值算法。
当编程应用并且需要在大的数据集上执行运算时,使用循环来对数据集中的每个元素做重复,并且执行所需要的过程。在每个重复期间,在单条数据上执行单个运算。这就是所谓的单指令单数据(Single Instruction Single Data,SISD)编程。SISD通常实现起来简单,并且易于维护和复用。然而,诸如这样的循环通常效率很低,因为它们可能必须重复几千次甚至几百万次。
总之,基于图像纹理边缘检测的插值算法的复杂度高、处理实时性差且处理效率低下。
发明内容
本发明的目的是提供一种基于SSE2指令集的图像插值方法,其能够克服现有技术的计算量大和没有充分利用图像邻域相关性和图像纹理方向性的不足。通过本发明,不仅可以获得高分辨率的插值图像,还提高了处理效率,满足图像处理的实时性要求。
本发明的目的通过如下技术方案实现:
本发明提供一种基于SSE2指令集的图像插值方法,其包括:
步骤一,选择当前像素点,并将该当前像素点邻域的图像数据载入xmm寄存器;
步骤二,插值当前像素点邻域的GR行和BG行各像素点的G分量;
步骤三,输出插值后的G分量数据;
步骤四,基于插值出的G分量数据插值当前像素点邻域的GR行各像素点的B分量和R分量;
步骤五,基于插值出的G分量数据插值当前像素点邻域的BG行各像素点的B分量和R分量;
步骤六,输出插值后的BGR格式24位图像数据。
更进一步地,所述步骤二包括:
求取当前像素点在所在邻域的水平方向和垂直方向的梯度值;
根据梯度值的比较结果判定当前像素点所在邻域的纹理方向;
根据当前像素点所在邻域的纹理方向选择相关的像素点进行插值操作。
更进一步地,所述求取当前像素点在所在邻域的水平方向和垂直方向的梯度值的过程包括:
利用如下公式求取当前像素点在所在邻域的水平方向上的梯度值:
nH=nHR+nHG+nHGR+nHB
其中:nH表示当前像素点在所在邻域的水平方向梯度值;nHR表示当前像素点R在所在领域水平方向上的梯度值,nHG表示G分量在所在邻域水平方向上的梯度值,nHGR表示G分量与当前像素点R在所在邻域水平方向上的梯度值,nHB表示B分量在所在邻域水平方向上的梯度值;
利用如下公式求取当前像素点在所在邻域的垂直方向上的梯度值:
nV=nVR+nVG+nVGR+nVB
nV表示当前像素点在所在邻域的垂直方向梯度值;nVR表示像素点R在所在邻域垂直方向上的梯度值;nVG表示像素点G在所在邻域垂直方向上的梯度值;nVGR表示像素点G与像素点R在所在邻域垂直方向上的梯度值;nVB表示像素点B在所在邻域垂直方向上的梯度值。
更进一步地,在所述根据梯度值的比较结果判定当前像素点所在邻域的纹理方向的过程之前,所述的基于SSE2指令集的图像插值方法还包括:
基于SSE2指令集,采用将nH和nV做差,然后将差值结果与0值进行比较,获得相应的比较结果。
更进一步地,所述根据梯度值的比较结果判定当前像素点所在邻域的纹理方向的过程包括:
利用如下公式判定当前像素点所在邻域的纹理方向:
式中,nH表示当前像素点在所在邻域的水平方向梯度值;nV表示当前像素点在所在邻域的垂直方向梯度值;fx表示当前像素点所在邻域纹理方向为水平方向;fy表示当前像素点所在邻域为平坦区域;fz表示当前像素点所在邻域纹理方向为垂直方向。
更进一步地,所述根据当前像素点所在邻域的纹理方向选择相关的像素点进行插值操作的过程,包括:
当前像素点所在邻域的纹理方向为水平方向,插值G分量时采用其垂直方向的邻域像素点;或者,
当前像素点所在邻域的纹理方向为平坦区域,插值G分量时采用其水平和垂直方向的邻域像素点做平均;或者,
当前像素点所在邻域的纹理方向为垂直方向,插值G分量时采用其水平方向的邻域像素点。
更进一步地,所述步骤三包括:
对插值后G分量寄存器与纹理方向逻辑存储寄存器分别执行逻辑“与”操作,得到基于纹理方向进行自适应插值G分量结果,并将计算出的自适应插值G分量结果缓存在对应的G分量寄存器中;
将各个G分量寄存器求和;
输出求和后得到的插值后的G数据。
更进一步地,所述步骤四包括:
插值GR行G22像素点的B分量,设为B22,其计算方法为:
B22=G22+((B12-G12)+(B32-G32))/2
其中,G22、B12、G12、B32和G32分别表示当前像素点邻域中GR行G22像素点、B12像素点、G12像素点、B32像素点和G32像素点;
插值GR行R23像素点的B分量,设为B23,其计算方法为:
B23=G23+((B12-G12)+(B14-G14)+(B32-G32)+(B34-G34))/4
其中,G23、B12、G12、B14、G14、B32、G32、B34、G34分别表示当前像素点邻域中GR行G23像素点、B12像素点、G12像素点、B14像素点、G14像素点、B32像素点、G32像素点、B34像素点和G34像素点;
插值GR行G22像素点的R分量,设为R22,其计算方法为:
R22=G22+((R21-G21)+(R23-G23))/2
其中,G22、R21、G21、R23和G23分别表示当前像素点邻域中GR行G22像素点、R21像素点、G21像素点、R23像素点和G23像素点;
直接获取R23像素点的R分量。
更进一步地,所述步骤五包括:
直接获取BG行的像素点B32的B分量;
插值BG行的像素点G33的B分量,设为B33,其计算方法为:
B33=G33+((B32-G32)+(B34-G34))/2
其中,G33、B32、G32、B34和G34分别表示当前像素点邻域中BG行的G33像素点、B32像素点、G32像素点、B34像素点和G34像素点;
插值像素点B32的R分量,设为R32,其计算方法为:
R32=G32+((R21-G21)+(R23-G23)+(R41-G41)+(R43-G43))/4
其中,G32、R21、G21、R23、G23、R41、G41、R43和G43分别表示当前像素点邻域中BG行的G32像素点、R21像素点、G21像素点、R23像素点、G23像素点、R41像素点、G41像素点、R43像素点和G43像素点;
插值像素点G33的R分量,设为R33,其计算方法为:
R33=G33+((R23-G23)+(R43-G43))/2
其中,G33、R23、G23、R43和G43分别表示当前像素点邻域中BG行的G33像素点、R23像素点、G23像素点、R43像素点和G43像素点。
更进一步地,所述步骤六包括:
在栈上申请缓冲区;
将当前各寄存器保存的相应R,G和B各通道的数据写入到缓冲区暂存;
将缓冲区暂存的BGR数据进行交错排列,逐个写入输出缓冲区;
将输出缓存区中的数据输出。
由上述本发明的技术方案可以看出,本发明基于SSE2指令集的图像插值方法充分考虑了图像纹理的方向性,基于图像纹理的方向进行插值,具有较高的图像分辨率,同时采用指令集实现可以一次指令周期处理多个像素点,提高了图像处理效率。
附图说明
图1为本发明所需要的普通计算机101和数字摄像机102组成的设备环境示意图;
图2为Bayer格式SENSOR成像模型示意图;
图3为Bayer格式排列方式;
图4为本发明实施例图像插值算法流程图;
图5为将Bayer格式GRBG排列的Raw数据载入CPU的128位XMM寄存器示意图;
图6为本发明实施例中raw图像数据载入xmm寄存器示意图;
图7为本发明实施例中为获取raw图像数据的高8位和低8位图像数据所进行的移位操作;
图8为插值GR行的G分量计算水平方向梯度值所需要载入寄存器的邻域像素点;
图9为插值GR行的G分量计算垂直方向梯度值所需要载入寄存器的邻域像素点;
图10为插值GR行的G分量时所需要载入的像素点位置;
图11为插值BG行的G分量计算水平方向梯度值所需要载入寄存器的邻域像素点;
图12为插值BG行的G分量计算垂直方向梯度值所需要载入寄存器的邻域像素点;
图13为插值BG行的G分量时所需要载入的像素点位置;
图14为插值图像B分量和R分量时所需要载入寄存器的邻域G像素点位置;
图15-1为当前图像区域为平坦区域G分量插值时分段函数编码实现方式;
图15-2为当前图像区域纹理方向为垂直方向G分量插值时分段函数编码实现方式;
图15-3为当前图像区域纹理方向为水平方向G分量插值时分段函数编码实现方式;
图16为根据不同的纹理方向插值G分量时的逻辑决策流程图;
图17为插值图像B分量和R分量时所需要载入寄存器的邻域R和B像素点位置;
图18为将插值后的图像数据按BGR24位排列方式写入输出缓冲区的代码示例图。
具体实施方式
本申请人考虑到SSE2指令集是Intel公司在SSE指令集的基础上发展起来的,相比于SSE,SSE2使用了144个新增指令,扩展了MMX技术和SSE技术,这些指令提高了广大应用程序的运行性能。随着MMX技术引进的SIMD(Single Instruction Mutiple Data,单指令多数据)整数指令从64位扩展到128位,使SIMD整数类型操作的有效执行率成倍提高。SSE2指令可以让程序开发人员极其灵活地实施算法,并在运行诸如图像视频编解码、3D图形渲染之类软件时增强性能。Intel是从Willmette核心的Pentium4开始支持SSE2指令集的,而AMD则是从K8架构的SledgeHammer核心的Opteron开始支持SSE2指令集的,它由SSE和MMX两个部分组成,SSE主要负责处理浮点数,MMX则专门计算整数。SSE2的寄存器容量是MMX的两倍。寄存器存储数据也增加了两倍。在指令处理器速度保持不变的情况下,通过SSE2优化过的程序和软件运行速度也提升两倍。由于SSE指令集和MMX指令集相兼容,因此,被MMX优化过的程序很容易被SSE2进行更深层次的优化,达到更好的效果。
SIMD是一种改善高度重复运算的应用性能的方法,具体地说,SIMD技术是一种对于多条数据同时执行相同运算的技术,其可以在一个指令执行周期同时处理多个图像数据,使得用户能够以更短的时间完成图像处理,以提高图像处理效率并为依靠图像进行其它处理的模块节约更多的时间。
本申请人基于上述分析,决定使用SSE2指令集技术的并行处理数据功能,这样不仅可以提高重建高分辨率图像实时性,作为一个创新点对实时的图像处理有很高的实用价值,而且对利用SSE2指令集技术降低图像处理中其它算法的复杂性也有很好的借鉴作用。
以下结合附图对本发明的实施例进行详细描述。
实施例一
本发明提供一种基于SSE2指令集的图像插值方法,它是在SIMD环境中(特别是对于具有128位向量寄存器的处理器)并利用Intel(英特尔)公司的SSE2指令集技术实现的图像插值方法,它针对相机输出的Bayer格式的原始Raw数据,利用SSE2并行技术并以像素为单位处理数据,单个指令操作可以同时处理多个像素,在获取纹理更清晰的RGB彩色图像的同时提高了处理效率。
本发明具体实施所需要的设备如图1所示,包括普通计算机101和数字摄像机102。
上述计算机101的CPU支持SSE2及以上指令集的微机,CPU的配置不低于Core i7920 2.66GHz,RAM不低于8GB。
上述数字摄相机102的图像分辨率不低于1628*1236。数字摄像机102的成像环境,如附图2所示:201表示输入可见光场景,202表示镜头,203表示Bayer格式的滤波器,204表示成像SENSOR。
下面以图3所示的Bayer格式GRBG排列为例来说明本发明的一种基于SSE2指令集的图像插值方法的图像插值具体实施流程。
如图3所示,该排列方式下,在所有的像素点301中,G分量302占有全部像素点的1/2,R分量303和B分量304分别占有全部像素点的1/4。
本发明实施例中图像插值的流程如附图4所示,其具体实施步骤S401~S409说明如下:
步骤S401,Raw8图像数据载入寄存器
此步骤中选择当前像素点的设定邻域范围内的像素点,并将其图形数据载入寄存器。本发明中使用当前图像像素点的5*5邻域范围内的像素点进行纹理方向的判断和图像缺失像素点的拟合;原始输入图像数据为8位,载入寄存器时以两个像素点为单位进行偏移,通过寄存器的高低8位移位操作来获取各个像素点。
下面以附图5所示的图像区域为例对本步骤进行说明。由于本发明插值方法需要用到当前像素点的5*5邻域范围内的像素点,且插值过程以Bayer(如GRBG)格式中2*2四个像素为一个单位进行,所以边缘区域的两行两列像素单独处理。从G22点开始进行插值操作,载入的图像数据位宽为8位,CPU的xmm寄存器位宽为128位,每次指令操作可以载入16个像素点;在附图5中,501所示G00和R01两个像素点,共占有16位,将G00的首地址载入xmm寄存器后,通过左移或者右移8位操作获取每一个像素值,低8位存储的是G分量,高8位存储的是R分量,通过左右移位操作可以快速获取图像的制定像素点数据(单一的分量)并能执行乘法和除法运算;以像素点G02和R03为起始点载入时,需将输入数据指针地址偏移16位,同理,以像素点G04为起始点载入时需将输入数据指针偏移32位,以像素点G10为起始点载入时需将输入数据指针偏移一行。为保证本发明实施例中各中间数据和最后结果的计算精确度,同时防止计算过程中数据溢出,所有的计算中将图像像素位宽扩展到16位;xmm寄存器指令以16位为单位,每次可以同时对8个像素点执行同一操作。
如附图7所示,701表示128位寄存器xmm0所存储的以G00R01为起始地址图像数据,702表示寄存器右移8位后获取的R分量数据,703表示寄存器左移8位后获取的G分量数据;502所示像素点载入时,需将输入数据指针地址偏移16位,同理,503所示像素点载入时需将输入数据指针偏移32位,504所示像素点载入时需将输入数据指针偏移一行。
载入的像素点位置与其在xmm寄存器中的地址的对应关系如附图6所示,eax用于存储输入Raw数据图像数据指针地址,601表示以G00开始的像素序列载入时存放在xmm寄存器中的位置,每个像素占有8位,共载入16个像素点;602表示输入指针偏移16位之后载入xmm寄存器,此时以像素点G02起始;603表示输入指针偏移32位之后载入xmm寄存器的示意图,此时以像素点G04起始。
为保证本发明实施例中各中间数据和最后结果的计算精确度,同时防止计算过程中数据溢出,所有的计算中将图像像素位宽扩展到16位;xmm寄存器指令以16位为单位,每次可以同时对8个像素点执行同一操作。由于算法在插值R和B分量时,都需要相应的G分量作为基准,同时图像纹理的方向也需要G分量参与计算,所以本发明在具体实施时需先插值每个像素点的G分量数据。
步骤S402,插值GR行像素点的G分量
插值GR行的G分量,只需插值R点的G分量,根据当前像素点R的邻域求取水平方向和垂直方向的梯度值,根据梯度值的比较结果判定当前纹理的方向为水平方向,垂直方向或者是平坦区域,选择不同的插值相关像素点进行插值操作。
仍然以附图5所示的图像区域为例对本步骤进行说明。
附图5中,对于像素点G22,本身为G分量,不需要插值。对于像素点R23,需要插值像素点R23的G分量数据。
由于SSE2指令每次可以处理8个像素点,但是这8个像素点所处的纹理方向可能不一致,所以在插值G分量时,需要计算当前像素点所在图像区域的纹理方向(水平方向,垂直方向和平坦区域),然后根据图像纹理方向确定计算插值G分量的方式。
确定出当前图像区域的纹理方向后,根据此纹理方向确定三种计算插值像素点R的G分量的方式(即水平纹理插值计算方式,垂直纹理插值计算方式和平坦区域插值计算方式),此时得到当前像素点计算G分量所需要的逻辑决策值,然后与三种方式插值出来的G分量执行逻辑“与”操作,即对插值后G分量寄存器与纹理方向逻辑存储寄存器分别执行逻辑“与”操作,从而得出每个像素点基于纹理方向判断的G值,最后对G分量寄存器求和后输出插值后的G分量,便得到寄存器各像素点根据纹理方向插值后的G分量,在完成G分量插值完成之后,写入输出数据缓冲区,以便于后续插值R分量和B分量时使用。具体实施步骤如图16所示:
步骤S1601,确定图像纹理的方向性。
确定图像纹理方向性的依据为当前像素点5*5邻域范围内水平方向像素与垂直方向像素梯度值的对比。
当前像素点邻域的水平方向梯度值设为nH,其计算方法如下:
nH=nHR+nHG+nHGR+nHB (1)
式(1)中,nHR表示当前像素点R所在邻域水平方向上的梯度,其计算方法为:
其中,式(2)中abs表示绝对值运算,当前像素点R所对应的邻域位置如附图8所示。
式(1)中,nHG表示G分量水平方向上的梯度值,其计算方法为:
式(1)中,nHGR表示G分量与当前像素点R在水平方向上的梯度值,其计算方法为:
nHGR=abs(G22+G24-2*R23) (4)
式(1)中,nHB表示B分量在水平方向上的梯度值,其计算方法为:
nHB=abs(B12-B14)+abs(B32-B34) (5)
当前像素点所在邻域的垂直方向梯度值设为nV;计算过程中所使用的邻域像素点如附图9所示,其计算方法如下:
nV=nVR+nVG+nVGR+nVB (6)
式(6)中,nVR表示像素点R在垂直方向上的梯度值,其计算方法为:
式(6)中,nVG表示像素点G在垂直方向上的梯度值,其计算方法为:
式(6)中,nVGR表示像素点G与像素点R在垂直方向上的梯度值,其计算方法为:
nVGR=abs(G13+G33-2*R23) (9)
式(6)中,nVB表示像素点B在垂直方向上的梯度值,其计算方法为:
nVB=abs(B12-B32)+abs(B14-B34) (10)
比较水平方向梯度值nH和垂直方向梯度值nV,根据比较结果确定当前区域纹理方向,具体如式(11)所示;
式(11)中,f0表示当前图像区域纹理方向为水平方向;f1表示当前图像区域为平坦区域;f2表示当前图像区域纹理方向为垂直方向。
采用SSE2指令集在本步骤中进行分段函数操作时,考虑到SSE2指令集中只有大于和等于两种比较指令,因此采用将nH和nV做差,然后跟0值进行比较的方法决策当前图像区域的纹理方向。在指令操作中,如果计算值为真,则置为FFFF,否则置为0000。其具体实施方法如附图15-1~附图15~3所示。
附图15-1中具体包括如下步骤:
步骤S1511,输入纹理方向数据(水平方向的梯度值和垂直方向的梯度值)存储到寄存器中。
输入nH到xmm0寄存器中;输入nV到xmm1寄存器中。
步骤S1512,缓存寄存器数据。
将xmm0寄存器中的数据缓存到xmm2寄存器中。
步骤S1513,将xmm2寄存器中的数据减去xmm1寄存器中的数据,并将最后所得差值存储在xmm2寄存器中。
步骤S1514,获取0值,并将其输入到xmm3寄存器中。
步骤S1515,比较xmm3寄存器和xmm2寄存器中的数据是否相等,若相等,则表示nV=nH,于是将xmm3寄存器中的0000值置为FFFF;否则置为0000。
附图15-2中具体包括如下步骤:
步骤S1521,输入纹理方向数据存储到寄存器中。
输入nH到xmm0寄存器中;输入nV到xmm1寄存器中。
步骤S1522,缓存寄存器数据。
将xmm0寄存器中的数据缓存到xmm2寄存器中。
步骤S1523,将xmm1寄存器中的数据减去xmm2寄存器中的数据,并将最后所得差值存储在xmm1寄存器中。
步骤S1524,获取0值,并将其输入到xmm4寄存器中。
步骤S1525,比较xmm4寄存器的数据是否大于xmm1寄存器中的数据,若大于则表示nH<nV,则将xmm4寄存器中的0000值置为FFFF;否则置为0000。
附图15-3中具体包括如下步骤:
步骤S1531,输入纹理方向数据存储到寄存器中。
输入nH到xmm0寄存器中;输入nV到xmm1寄存器中。
步骤S1532,缓存寄存器数据。
将xmm0寄存器中的数据缓存到xmm2寄存器中。
步骤S1533,将xmm1寄存器中的数据减去xmm2寄存器中的数据,并将最后所得差值存储在xmm1寄存器中。
步骤S1534,获取0值,并将其输入到xmm4寄存器中。
步骤S1535,比较xmm4寄存器的数据是否大于xmm1寄存器中的数据,若大于则表示nH>nV,则将xmm4寄存器中的0000值置为FFFF;否则置为0000。
经过上述附图15-1~附图15-3中的步骤确定好当前区域纹理方向后,根据当前区域纹理方向的不同,采用不同的插值方法插值G分量,具体如下面步骤S1602~步骤S1604所示。插值过程中所使用的像素点位置如附图10所示。
步骤S1602,输入图像纹理方向到纹理方向逻辑存储寄存器。
步骤S1603,计算水平方向纹理插值后G分量,并将其输入到相应的G分量寄存器。
f0表示当前图像区域纹理方向为水平方向,此时插值G分量采用其垂直方向的邻域像素点,具体如式(12)所示:
f0=(G13+G33)/2+(2*R23-R03-R43)/4 (12)
步骤S1604,计算垂直方向纹理插值后G分量,并将其输入到相应的G分量寄存器。
f1表示当前图像区域为平坦区域,此时插值G分量采用其水平方向和垂直方向的邻域像素点的平均值,如式(13)所示:
f1=(G13+G33+G22+G24)/4+(4*R23-R03-R43-R21-R25)/8 (13)
步骤S1605,计算平坦图像区域插值后G分量,并将其输入到相应的G分量寄存器。
f2表示当前图像区域纹理方向为垂直方向,此时插值G分量采用其水平方向的邻域像素点,如式(14)所示:
f2=(G22+G24)/2+(2*R23-R21-R25)/4 (14)
步骤S1606,插值后G分量寄存器与相应的纹理方向逻辑存储寄存器分别执行逻辑“与”操作,得到基于纹理方向进行自适应插值G分量结果,并将计算出的G分量结果缓存在对应的G分量寄存器中,也就是说用自适应插值G分量结果替换掉原有相应G分量寄存器中的值。
步骤S1607,将各个G分量寄存器求和。
步骤S1608,输出求和后得到的插值后的G数据。
经过上述步骤S1601~步骤S1608,最终输出插值GR行像素点的G分量。
步骤S403,插值BG行像素点的G分量
对于像素点B32,插值G分量,首先计算当前图像区域的纹理方向,然后根据纹理方向的不同选择相应的插值算法;与上面GR行像素点插值G分量的方法一致,当前像素点的纹理方向根据图像区域像素的水平方向梯度和垂直方向梯度进行判断,设水平方向梯度为nH,其计算过程中所需要使用的像素点如附图11所示,垂直方向梯度为nV,其计算过程中所需使用的像素点如附图12所示,其中,水平方向的梯度nH计算方法如式(15):
nH=nHB+nHG+nHGB+nHR (15)
式(15)中,nHB表示当前像素点B水平方向上的梯度值,其计算方法为:
式(15)中,nHG表示G分量水平方向上的梯度值,其计算方法为:
式(15)中,nHGB表示G分量和当前像素点B在水平方向上的梯度值,其计算方法为:
nHGB=abs(G31+G33-2*B32) (18)
式(15)中,nHR表示R分量水平方向上的梯度值,其计算方法为:
nHR=abs(R21-R23)+abs(R41-R43) (19)
当前像素点所在邻域垂直方向的梯度计算方法为:
nV=nVB+nVG+nVGB+nVR (20)
式(20)中,nVB表示当前像素点B在垂直方向上的梯度值,其计算方法为:
式(20)中,nVG表示G分量在垂直方向上的梯度值,其计算方法为:
式(20)中,nVGB表示G分量与当前像素点B在垂直方向上的梯度值,其计算方法为:
nVGB=abs(G22+G42-2*B32) (23)
式(20)中,nVR表示R分量在垂直方向上的梯度值,其计算方法为:
nVR=abs(R21-R41)+abs(R23-R43) (24)
比较水平方向梯度值nH和垂直方向梯度值nV,根据比较结果确定当前图像区域的纹理方向,具体如式(25)所示;
式(25)中,fa表示为当前图像区域纹理方向为水平方向;fb表示为当前图像区域为平坦区域;fc表示为当前图像区域纹理方向为垂直方向。
根据式(25)确定的当前图像区域纹理方向的不同,采用不同的插值方法插值G分量,插值过程中所使用的像素点位置如附图13所示。式(25)中,fa表示为当前图像区域纹理方向为水平方向,这种情况下插值G分量时采用其垂直方向的邻域像素点:
fa=(G22+G42)/2+(2*B32-B12-B52)/4 (26)
式(25)中,fb表示为当前图像区域为平坦区域,这种情况下插值G分量时采用其水平和垂直方向的邻域像素点的平均值:
fb=(G22+G42+G31+G33)/4+(4*B32-B12-B52-B30-B34)/8 (27)
式(25)中,fc表示为当前图像区域纹理方向为垂直方向,这种情况下插值G分量时采用其水平方向的邻域像素点:
fc=(G31+G33)/2+(2*B32-B30-B34)/4 (28)
G33本身为G像素,不需要插值G分量。
步骤S404,输出插值后的G分量数据
由于输出的当前G分量为单通道排列,可以直接采用movdqu指令将xmm寄存器中存储的G分量数据写入输出缓冲区,便于后续的插值缺失的R和B分量数据。
步骤S405,插值GR行像素点的B分量
基于前述步骤插值出的G分量,插值GR行各像素点的B分量,并考虑当前纹理的方向性和B分量与G分量的相关性做差分处理,进行插值。首先插值G22点的B分量,设为B22,计算过程中所使用的邻域像素点如附图14和附图17所示,其计算方法为:
B22=G22+((B12-G12)+(B32-G32))/2 (29)
其中,G22、B12、G12、B32和G32分别表示当前像素点邻域中GR行G22像素点、B12像素点、G12像素点、B32像素点和G32像素点;
其次插值R23点的B分量,设为B23,计算过程中所使用的邻域像素点如附图17和附图14所示,其计算方法为:
B23=G23+((B12-G12)+(B14-G14)+(B32-G32)+(B34-G34))/4 (30)
其中,G23、B12、G12、B14、G14、B32、G32、B34、G34分别表示当前像素点邻域中GR行G23像素点、B12像素点、G12像素点、B14像素点、G14像素点、B32像素点、G32像素点、B34像素点和G34像素点。
步骤S406,插值GR行像素点的R分量
基于前述步骤插值出的G分量,插值GR行各像素点的R分量。利用已经插值出的G分量图像数据,执行B分量与G分量的差分操作,充分考虑图像纹理的方向性进行插值。
首先插值G22点的R分量,设为R22;R23本身为R分量,不需要插值。计算过程中所使用的邻域像素点如附图17和附图14所示,其计算方法为:
R22=G22+((R21-G21)+(R23-G23))/2 (31)
其中,G22、R21、G21、R23和G23分别表示当前像素点邻域中GR行G22像素点、R21像素点、G21像素点、R23像素点和G23像素点。
步骤S407,插值BG行像素点的B分量
插值BG行像素点的B分量;只需插值出G点的B分量,基于G分量所包含的方向性插值出B分量,能够更好地保留图像的细节和色彩。
像素点B32位置本身为B分量,不需要插值,只需插值G33点的B分量,设为B33,计算过程中所使用的邻近区域的像素点如附图17和附图14所示,其计算方法为:
B33=G33+((B32-G32)+(B34-G34))/2 (32)
其中,G33、B32、G32、B34和G34分别表示当前像素点邻域中BG行的G33像素点、B32像素点、G32像素点、B34像素点和G34像素点。
步骤S408,插值BG行像素点的R分量
插值BG行像素点的R分量;方法与上述步骤S407类似,插值出缺失的R分量。
首先插值像素点B32的R分量,设为R32,计算过程中所使用的邻域像素点如附图17和附图14所示,其计算方法为:
R32=G32+((R21-G21)+(R23-G23)+(R41-G41)+(R43-G43))/4 (33)
其中,G32、R21、G21、R23、G23、R41、G41、R43和G43分别表示当前像素点邻域中BG行的G32像素点、R21像素点、G21像素点、R23像素点、G23像素点、R41像素点、G41像素点、R43像素点和G43像素点。
其次插值像素点G33的R分量,设为R33,计算过程中所使用的邻域像素点如附图17和附图14所示,其计算方法为:
R33=G33+((R23-G23)+(R43-G43))/2 (34)
其中,G33、R23、G23、R43和G43分别表示当前像素点邻域中BG行的G33像素点、R23像素点、G23像素点、R43像素点和G43像素点。
通过上述步骤S402至步骤S408,插值出所有像素点的R,G和B各通道相应分量数据,最后需要将这些数据写入输出图像缓冲区。由于输入图像缓冲区大小为图像宽*图像高,输出图像缓存区为图像宽*图像高*3,因此本发明在具体实施过程中,输入数据和输出数据长度是不一样的,因此不能采用统一缓冲区进行数据存储。
步骤S409,输出插值后的BGR数据
输出插值后的BGR格式24位图像数据,首先使用高速缓存保存当前各寄存器保存的相应R,G和B各通道的数据,然后交错排列BGR数据,写入输出缓冲区。
由于输出插值后的图像数据以BGR格式排列,其每个排列周期具有24位长度,不能采用16字节对齐的方式直接采用SSE2指令写入输出缓冲区,同时基于处理速度考虑,采用在栈上申请缓冲区,将xmm寄存器上的数据先写入缓冲区暂存,然后再逐个写入输出缓冲区。由于栈上缓冲开辟自CPU的高速缓存(L1-Cache),数据延迟较小,与xmm寄存器的速度相当,因此可以快速的进行数据的载入载出。
对于边缘的两行和两列像素,进行特殊的处理,只需采用邻域像素进行插值并输出即可。如果输入数据的宽度不能被16整除,则SSE2指令集加速处理的部分为能被16整除部分的相关列,而不能整除的部分需要采用C语言进行编码实现,然后写入输出缓冲区即可。
具体实施流程如附图18所示,包括如下步骤:
步骤S1801,寄存器eax、寄存器ebx入栈,并将其初始化为0。
步骤S1802,将B、G、R缓存在栈上,即将xmm4寄存器中的数据缓存到ebp-10h栈上;将xmm5寄存器中的数据缓存到ebp-20h栈中;将xmm6寄存器中的数据缓存到ebp-30h栈中。
步骤S1803,ebp-10h栈上的数据存到寄存器ebx中,并依此循环变量。
步骤S1804,判断寄存器ebx中的数据是否为零?若为零,则执行步骤S1807;否则执行步骤S1805;
步骤S1805,将栈上的各个通道数据安装B、G、R顺序写入[ebx]中。
步骤S1806,ebp递增1,ebx递减1。
步骤S1807,寄存器ebx、寄存器eax出栈。
对于边缘的两行和两列像素,进行特殊的处理,只需采用邻域的2*2邻域进行插值并输出即可。如果输入数据的宽度不能被16整除,则SSE2指令集加速处理的部分为能被16整除部分的相关列,而不能整除的部分需要采用C语言进行编码实现,然后写入输出缓冲区即可。
本发明实施例所述基于SSE2指令集的图像插值方法,通过采用Intel指令集加速5*5图像插值,在获得高分辨率图像的同时,提高了图像处理效率。
虽然本发明已以较佳实施例公开如上,但实施例并不限定本发明。在不脱离本发明之精神和范围内,所做的任何等效变化或润饰,同样属于本发明之保护范围。因此本发明的保护范围应当以本申请的权利要求所界定的内容为标准。

Claims (9)

1.一种基于SSE2指令集的图像插值方法,其特征在于,所述基于SSE2指令集的图像插值方法包括:
步骤一,选择当前像素点,并将该当前像素点邻域的图像数据载入xmm寄存器;
步骤二,插值当前像素点邻域的GR行和BG行各像素点的G分量;包括:
求取当前像素点在所在邻域的水平方向和垂直方向的梯度值;
根据梯度值的比较结果判定当前像素点所在邻域的纹理方向;
根据当前像素点所在邻域的纹理方向选择相关的像素点进行插值操作;
步骤三,输出插值后的G分量数据;
步骤四,基于插值出的G分量数据插值当前像素点邻域的GR行各像素点的B分量和R分量;
步骤五,基于插值出的G分量数据插值当前像素点邻域的BG行各像素点的B分量和R分量;
步骤六,输出插值后的BGR格式24位图像数据。
2.根据权利要求1所述的基于SSE2指令集的图像插值方法,其特征在于,所述求取当前像素点在所在邻域的水平方向和垂直方向的梯度值的过程包括:
利用如下公式求取当前像素点在所在邻域的水平方向上的梯度值:
nH=nHR+nHG+nHGR+nHB
其中:nH表示当前像素点在所在邻域的水平方向梯度值;nHR表示当前像素点R在所在领域水平方向上的梯度值,nHG表示G分量在所在邻域水平方向上的梯度值,nHGR表示G分量与当前像素点R在所在邻域水平方向上的梯度值,nHB表示B分量在所在邻域水平方向上的梯度值;
利用如下公式求取当前像素点在所在邻域的垂直方向上的梯度值:
nV=nVR+nVG+nVGR+nVB
nV表示当前像素点在所在邻域的垂直方向梯度值;nVR表示像素点R在所在邻域垂直方向上的梯度值;nVG表示像素点G在所在邻域垂直方向上的梯度值;nVGR表示像素点G与像素点R在所在邻域垂直方向上的梯度值;nVB表示像素点B在所在邻域垂直方向上的梯度值。
3.根据权利要求1所述的基于SSE2指令集的图像插值方法,其特征在于,在所述根据梯度值的比较结果判定当前像素点所在邻域的纹理方向的过程之前,所述的基于SSE2指令集的图像插值方法还包括:
基于SSE2指令集,采用将nH和nV做差,然后将差值结果与0值进行比较,获得相应的比较结果。
4.根据权利要求3所述的基于SSE2指令集的图像插值方法,其特征在于,所述根据梯度值的比较结果判定当前像素点所在邻域的纹理方向的过程包括:
利用如下公式判定当前像素点所在邻域的纹理方向:
<mrow> <mi>G</mi> <mo>=</mo> <mfenced open = "{" close = ""> <mtable> <mtr> <mtd> <msub> <mi>f</mi> <mi>x</mi> </msub> </mtd> <mtd> <mrow> <mi>n</mi> <mi>H</mi> <mo>&gt;</mo> <mi>n</mi> <mi>V</mi> </mrow> </mtd> </mtr> <mtr> <mtd> <msub> <mi>f</mi> <mi>y</mi> </msub> </mtd> <mtd> <mrow> <mi>n</mi> <mi>H</mi> <mo>=</mo> <mi>n</mi> <mi>V</mi> </mrow> </mtd> </mtr> <mtr> <mtd> <msub> <mi>f</mi> <mi>z</mi> </msub> </mtd> <mtd> <mrow> <mi>n</mi> <mi>H</mi> <mo>&lt;</mo> <mi>n</mi> <mi>V</mi> </mrow> </mtd> </mtr> </mtable> </mfenced> </mrow>
式中,nH表示当前像素点在所在邻域的水平方向梯度值;nV表示当前像素点在所在邻域的垂直方向梯度值;fx表示当前像素点所在邻域纹理方向为水平方向;fy表示当前像素点所在邻域为平坦区域;fz表示当前像素点所在邻域纹理方向为垂直方向。
5.根据权利要求1所述的基于SSE2指令集的图像插值方法,其特征在于,所述根据当前像素点所在邻域的纹理方向选择相关的像素点进行插值操作的过程,包括:
当前像素点所在邻域的纹理方向为水平方向,插值G分量时采用其垂直方向的邻域像素点;或者,
当前像素点所在邻域的纹理方向为平坦区域,插值G分量时采用其水平和垂直方向的邻域像素点做平均;或者,
当前像素点所在邻域的纹理方向为垂直方向,插值G分量时采用其水平方向的邻域像素点。
6.根据权利要求1至5任意一项所述的基于SSE2指令集的图像插值方法,其特征在于,所述步骤三包括:
对插值后G分量寄存器与纹理方向逻辑存储寄存器分别执行逻辑“与”操作,得到基于纹理方向进行自适应插值G分量结果,并将计算出的自适应插值G分量结果缓存在对应的G分量寄存器中;
将各个G分量寄存器求和;
输出求和后得到的插值后的G数据。
7.根据权利要求6所述的基于SSE2指令集的图像插值方法,其特征在于,所述步骤四包括:
插值GR行G22像素点的B分量,设为B22,其计算方法为:
B22=G22+((B12-G12)+(B32-G32))/2
其中,G22、B12、G12、B32和G32分别表示当前像素点邻域中GR行G22像素点、B12像素点、G12像素点、B32像素点和G32像素点;
插值GR行R23像素点的B分量,设为B23,其计算方法为:
B23=G23+((B12-G12)+(B14-G14)+(B32-G32)+(B34-G34))/4
其中,G23、B12、G12、B14、G14、B32、G32、B34、G34分别表示当前像素点邻域中GR行G23像素点、B12像素点、G12像素点、B14像素点、G14像素点、B32像素点、G32像素点、B34像素点和G34像素点;
插值GR行G22像素点的R分量,设为R22,其计算方法为:
R22=G22+((R21-G21)+(R23-G23))/2
其中,G22、R21、G21、R23和G23分别表示当前像素点邻域中GR行G22像素点、R21像素点、G21像素点、R23像素点和G23像素点;
直接获取R23像素点的R分量。
8.根据权利要求7所述的基于SSE2指令集的图像插值方法,其特征在于,所述步骤五包括:
直接获取BG行的像素点B32的B分量;
插值BG行的像素点G33的B分量,设为B33,其计算方法为:
B33=G33+((B32-G32)+(B34-G34))/2
其中,G33、B32、G32、B34和G34分别表示当前像素点邻域中BG行的G33像素点、B32像素点、G32像素点、B34像素点和G34像素点;
插值像素点B32的R分量,设为R32,其计算方法为:
R32=G32+((R21-G21)+(R23-G23)+(R41-G41)+(R43-G43))/4
其中,G32、R21、G21、R23、G23、R41、G41、R43和G43分别表示当前像素点邻域中BG行的G32像素点、R21像素点、G21像素点、R23像素点、G23像素点、R41像素点、G41像素点、R43像素点和G43像素点;
插值像素点G33的R分量,设为R33,其计算方法为:
R33=G33+((R23-G23)+(R43-G43))/2
其中,G33、R23、G23、R43和G43分别表示当前像素点邻域中BG行的G33像素点、R23像素点、G23像素点、R43像素点和G43像素点。
9.根据权利要求8所述的基于SSE2指令集的图像插值方法,其特征在于,所述步骤六包括:
在栈上申请缓冲区;
将当前各寄存器保存的相应R,G和B各通道的数据写入到缓冲区暂存;
将缓冲区暂存的BGR数据进行交错排列,逐个写入输出缓冲区;
将输出缓存区中的数据输出。
CN201510301095.5A 2015-06-05 2015-06-05 一种基于sse2指令集的图像插值方法 Active CN104952038B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510301095.5A CN104952038B (zh) 2015-06-05 2015-06-05 一种基于sse2指令集的图像插值方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510301095.5A CN104952038B (zh) 2015-06-05 2015-06-05 一种基于sse2指令集的图像插值方法

Publications (2)

Publication Number Publication Date
CN104952038A CN104952038A (zh) 2015-09-30
CN104952038B true CN104952038B (zh) 2017-12-29

Family

ID=54166672

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510301095.5A Active CN104952038B (zh) 2015-06-05 2015-06-05 一种基于sse2指令集的图像插值方法

Country Status (1)

Country Link
CN (1) CN104952038B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107527320B (zh) * 2016-06-22 2020-06-02 南京视察者图像识别科技有限公司 一种加速双线性插值计算的方法
CN109685731B (zh) * 2018-12-13 2023-07-18 浪潮通用软件有限公司 一种基于sse4指令集加快图片渐变速度的方法
CN114647467A (zh) * 2020-12-21 2022-06-21 深信服科技股份有限公司 水印更新方法、装置、系统及存储介质
WO2022151330A1 (zh) * 2021-01-15 2022-07-21 华为技术有限公司 一种图像处理的方法及相关装置

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102324102A (zh) * 2011-10-08 2012-01-18 北京航空航天大学 一种图像场景空洞区域结构和纹理信息自动填补方法
CN103595981A (zh) * 2013-10-25 2014-02-19 西安电子科技大学 基于非局部低秩的色彩滤波阵列图像去马赛克方法
CN103595980A (zh) * 2013-10-25 2014-02-19 西安电子科技大学 基于轮廓非局部均值的色彩滤波阵列图像去马赛克方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7177889B2 (en) * 2002-01-23 2007-02-13 General Instrument Corp. Methods and systems for efficient filtering of digital signals
WO2012053139A1 (ja) * 2010-10-20 2012-04-26 パナソニック株式会社 画像処理装置および画像処理方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102324102A (zh) * 2011-10-08 2012-01-18 北京航空航天大学 一种图像场景空洞区域结构和纹理信息自动填补方法
CN103595981A (zh) * 2013-10-25 2014-02-19 西安电子科技大学 基于非局部低秩的色彩滤波阵列图像去马赛克方法
CN103595980A (zh) * 2013-10-25 2014-02-19 西安电子科技大学 基于轮廓非局部均值的色彩滤波阵列图像去马赛克方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
AVS视频编码中分像素插值的SSE2优化方法;曹明等;《电视技术》;20101231;第34卷(第11期);第30-32页 *

Also Published As

Publication number Publication date
CN104952038A (zh) 2015-09-30

Similar Documents

Publication Publication Date Title
CN104952038B (zh) 一种基于sse2指令集的图像插值方法
CN101677358B (zh) 用于高质量图像和视频升频的系统和方法
JP4971442B2 (ja) ピクセルデータ変換のための画像処理装置及び方法
US8861846B2 (en) Image processing apparatus, image processing method, and program for performing superimposition on raw image or full color image
TWI552111B (zh) 硬體與軟體分劃的影像處理管線
CN103067671A (zh) 一种显示图像的方法及装置
CN104184981A (zh) 一种基于缩减像素采样处理的低解析度显示方法及设备
TW201246126A (en) Image processing device and processing method thereof
Gour et al. Hardware accelerator for real-time image resizing
CN104038746A (zh) 一种bayer格式图像数据插值方法
WO2016197393A1 (zh) 并行多相位图像插值装置和方法
TWI540537B (zh) 圖像縮小處理的方法及裝置
US20150213578A1 (en) Method for electronic zoom with sub-pixel offset
CN116309033A (zh) 超分辨率图像生成方法、装置以及存储介质
CN101662598A (zh) 一种连续视频数据流的缩放系统
CN114155166A (zh) 一种基于fpga的图像颜色还原的插值方法
Zemčík et al. Accelerated image resampling for geometry correction
Safinaz et al. VLSI realization of Lanczos interpolation for a generic video scaling algorithm
CN107240064A (zh) 图像校正方法、装置及终端
Sudhakaran et al. High-quality image scaling using v-model
KR100665485B1 (ko) 디지털 신호 처리 장치 및 디지털 신호 처리 방법
Shuhua et al. GPU-based barrel distortion correction for acceleration
US20230196507A1 (en) Device, method and program for processing image
CN115689895B (zh) 基于Lanczos插值的上采样硬件处理系统
CN116977173A (zh) 基于色差和色比的边缘优化Bayer插值方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant