基于图像元数据的旋转及缩放

前言


当我们在相机预览时,需要对视频流buffer进行旋转及缩放时,往往是将buffer转换成image再进行旋转及缩放操作,然后转回视频流buffer,这样一次图像处理的操作消耗了太多性能,如果引入opencv,又会使得项目变大变重,这种情况下,我们可以直接操作图像元数据,这样更便捷,性能相对来说也有提升。

图像处理方案


图像数据基本属性


像素点:组成图像的基本元素,图像包含的像素越多,图像越大

色彩空间:描述像素点颜色的色彩集,相同的RGB值对应不同的色彩空间,所展示的颜色可能不一样

通道数:像素点对应色彩通道(RGB三通道,RGBA四通道)

位图信息:像素点中通道排列顺序

位深度:一个像素所用的位数

进行图像旋转及缩放暂时只需要了解以上图像属性即可


图像旋转及缩放


图像旋转及缩放的实际上就是像素点的处理,想要得到处理后图像中每个像素点的颜色值,我们需要在原图像中找到对应的像素点,经过处理后,赋值到新图像中。所以图像旋转及缩放本质上就是一个找像素点的过程。

映射像素点


图像旋转


以向左旋转为例,推导图像左旋转的公式  

图像左旋转

像素点映射关系(这里只列出图像中有颜色的色块):

图像左旋转像素点映射关系

从像素点的映射关系可以得出目标像素点坐标与原始图像坐标之间的映射公式:

dst(x,y)=org(orgW-y-1, x)

另外附上右旋转,180°旋转,镜像的公式,具体推理过程可以参考上面的方法自己进行推理

右旋转:

dst(x,y)=org(y, orgH-x-1)

180°旋转:

dst(x,y)=org(orgH-x-1, orgW-y-1)

水平镜像:

dst(x,y)=org(orgW-x-1, y)

垂直镜像:

dst(x,y)=org(x, orgH-y-1)


图像缩放


以图像放大为例,我们将一张2*2的图像放大到4*4,如下图所示:

图像缩放

先计算缩放比,目标图像的坐标除以缩放比就可以得到对应的原始图像的坐标

scaleW=\frac{dstW}{orgW}

scaleH=\frac{dstH}{orgH}

dst(x,y)=org(\frac{x}{scaleW},\frac{y}{scaleH})

通过公式,得出2*2映射到4*4图像的像素点映射关系(这里只列出图像中有颜色的色块):

图像缩放映射关系

可以发现映射到原始图像的坐标点中包含很多小数点坐标,无法具体到某个像素点取值,所以在这里就需要进行算法运算,以求出目标像素点的最佳取值。

目前图像缩放算法已经比较成熟,较为常用的有三种缩放算法:

1.最邻近插值法:

最邻近插值法通常是直接将小数点后的数值舍去,直接取整:

x=floorf(x)

使用floor函数可以对float值进行取整,取整之后的对应结果:

最邻近插值法

优缺点:最邻近插值非常简单,但得到的图像质量较差,进行缩放的比例较大时会产生较为明显的锯齿。

2.双线性插值法:

双线性插值法是根据映射像素点周围4个像素点的综合求值得出来的。

假设我们的映射的像素点坐标为P0(1.3,1.7)。

这时候四周的像素点就是P1(1,1),P2(1,2),P3(2,1),P4(2,2)。

以P0到P1,P2,P3,P4的距离为权重关系,计算4个像素点的综合像素值,得到P0的像素值。

双线性插值法

看到这张图,有木有想起初中老师经常出的一道题,求阴影部分面积!

映射像素点坐标用org(i+v,j+u)表示

其中i、j代表整数部分,v、u代表小数部分

org(i+v,j+u)=org(i,j)*(1-v)*(1-u)+org(i+1,j)*v*(1-u)+org(i,j+1)*(1-v)*u+org(i+1,j+1)*v*u

了解卷积的朋友看着这个式子是不是有点眼熟,这个式子可以用卷积公式来表达:

org(i+v,j+u)=\sum_{row=0}^1\sum_{col=0}^1f(i+row,j+col)S(row-v)S(col-u)

其中函数表达式的值为:

f(i+row,j+col)=org(i+row,j+col)

S(row-v)=S(col-u)=S(x)=1-|x|

通过卷积公式,我们可以认为org(i+v,j+u)为周围4个像素的卷积和。

优缺点:双线性内插值法计算量较大,缩放后图像质量相对较高,不会出现像素值不连续的的情况。

3.三次卷积法(双立方差值算法)

三次卷积法是根据映射像素点周围16个像素点的综合求值得出来的。

映射像素点坐标用org(i+v,j+u)表示

其中i、j代表整数部分,v、u代表小数部分

运算所涉及到的像素点如下图:

三次卷积法

org(i+v,j+u)为以上16个点卷积之和

我们已经通过双线性插值推导出图像缩放的卷积公式,只是设计的像素点数量不一样,我们将16个像素点带入到卷积公式:

org(i+v,j+u)=\sum_{row=-1}^2\sum_{col=-1}^2f(i+row,j+col)S(row-v)S(col-u)

在双线性差之中,决定相关像素点的权重函数S(x)在16像素点的卷积中已经不适用了,这里使用Bicubic interpolation中三次卷积的权重公式:

三次卷积权重公式

这个公式有3个特别重要的特点:

1)S(0) = 1

2)当n为整数时,S(n) = 0

3)当x超出范围时,S(x)为0

这里依照Cubic Hermite spline,a取值-0.5

a=-0.5
Cubic Hermite spline曲线

S(x)=S(row-v)=S(col-u)

-2<x<-11<x<2时,S(x)函数取值为正

-1<x<1时,S(x)函数取值为负

我们尝试几个特殊值:

当u=0,v=0时,S(x)函数在16个像素点中的权重表现:

第一行和第一列为对应行和列的权重系数,我们可以看到,只有在org(i,j)时系数为1,当u,v为0时,我们映射像素点就是org(i,j)

当u,v等于0时

当u=0,v=0.5时,S(x)函数在16个像素点中的权重表现:

当u=0时,只有col=0那一列参与了像素值计算,

u=0,v=0.5时的权重表现

当u=0.2,v=0.7时,S(x)函数在16个像素点中的权重表现:

当u,v都不为0时,16个像素点全都参与计算,权重表现如下,至于为什么中间及四个角的权重为正,侧边为负,我也还没想明白,不知道是不是因为人的视觉原因才这么去计算的,如果有知道的朋友可以告知下。

u=0.2,v=0.7时的权重表现

优缺点:三次卷积法能计算量比较大,缩放后的图像质量很高,是三种算法中效果最好的。

实际测试效果


基于iOS实现了下这套原理,将一张180*180的图片放大到480*480

最邻近插值法
双线性插值法
三次卷积法

可以明显看到使用最邻近插值法缩放的图片锯齿感明显,使用双线性插值法后,平滑感明显提升,三次卷积法缩放的图片的图片在平滑感上略有提升,图片层次更好。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容