极品垃圾

初学VC ,就是把每天所看到的整理到博客,慢慢消化这些内容。见证我的学习之路吧。很多都是转载。

公告

初学VC ,就是把每天所看到的整理到博客,慢慢消化这些内容。见证我的学习之路吧。很多都是转载。
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

  • 随笔 - 0
  • 文章 - 61
  • 评论 - 1
  • 引用 - 0

常用链接

留言簿(2)

随笔分类

文章分类(55)

文章档案(61)

搜索

  •  

最新评论

2次插值

 

图像的双线性插值放大算法中,目标图像中新创造的象素值,是由源图像位置在它附近的2*2区域4个邻近象素的值通过加权平均计算得出的。双线性内插值算法放大后的图像质量较高,不会出现像素值不连续的的情况。然而次算法具有低通滤波器的性质,使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊。

图1

X方向的线性插值

对于标准的双线性差值算法,X方向的线性插值:

[通用1]

[通用2]

具体到我们所实现的算法中,我们使Q11、Q12、Q21、Q22为光栅上相邻的四点,即P只能落于这四点其中一点上。Δcol是当前像素离像素所属区域原点的水平距离,比如图2,各种不同的颜色代表一个区域,区域原点为区域左上角的像素。

 

δ R2 = Color Q22 −Color Q12 ∙Δcol+Color Q12 ∙256 (1)

δ R1 = Color Q21 −Color Q11 ∙Δcol+Color Q11 ∙256 (2)

 

其中:Δcol=(DestColNumber∙((SrcWidth≪8)/DestWidth))&255, Color(X)表示点X的颜色,具体算法使用的是24位真彩色格式。

Y方向的线性插值

做完X方向的插值后再做Y方向的插值,对于一般情况,有:

     [通用3]

而我们的具体算法中,Y方向的线性插值方法如(3)所示。Δrow是当前像素离像素所属区域原点的垂直距离,比如图2,各种不同的颜色代表一个区域,区域原点为区域左上角的像素。

 

Color P = δ R2 ∙256+ δ R2 −δ R1 ∙Δrow ≫16 (3)

 

其中:Δrow=(DestRowNumber∙((SrcHeight≪8)/DestHeight))&255,由于前面为了便于计算左移了16位,因此最后需要右移16位保持匹配。

算法描述

类 C 伪码如下:

  1. for (目标图像第一行的像素++)      
  2. {      
  3.     // 源图像上Q12, Q22, Q11, Q21的选取见下一节      
  4.     获取源图像Q12, Q22, Q11, Q21的颜色;      
  5.      
  6.     // X 方向的插值      
  7.     δ(R2) = (Color(Q22) - Color(Q12)) * δcol+ Color(Q12) * 256;      
  8.     δ(R1) = (Color(Q21) - Color(Q11)) * δcol+ Color(Q11) * 256;      
  9.      
  10.     // 保存 δ(R1)到一个临时数组,因为下一行的δ(R2)等于这一行的δ(R1)      
  11.     temp[i++] = δ(R1);      
  12.      
  13.     // Y 方向的插值      
  14.     Color(P) = (δ(R2) * 256 + (δ(R2) - δ(R1)) *δrow) >> 16;      
  15.      
  16.     将 P 输出到目标位图中。      
  17. }      
  18.      
  19. for (目标图像第二行到最末行)      
  20. {      
  21.     for (行上的像素++)      
  22.     {      
  23.         // 源图像上Q12, Q22, Q11, Q21的选取见下一节      
  24.         获取源图像Q12, Q22, Q11, Q21的颜色;      
  25.      
  26.         // X 方向的插值      
  27.         δ(R2) = temp[i++]; // 下一行的δ(R2)等于上一行的δ(R1)      
  28.         δ(R1) = (Color(Q21) - Color(Q11)) *δcol+ Color(Q11) * 256;      
  29.      
  30.         // 保存 δ(R1)到一个临时数组,因为下一行的δ(R2)等于这一行的δ(R1)      
  31.         temp[i++] = δ(R1);      
  32.      
  33.         // Y 方向的插值      
  34.         Color(P) = (δ(R2) * 256 + (δ(R2) - δ(R1)) * δrow) >> 16;      
  35.      
  36.         将 P 输出到目标位图中。      
  37.     }      
  38. }    

 

 

算法中Q12, Q22, Q11, Q21的选取

 

我们以放大两倍为例,说明选取Q12, Q22, Q11, Q21的过程。源图像3*3区域放大为目标区域6*6区域。设以下为目标图像:

A

A

B

B

 

 

A

A

B

B

 

 

 

 

C

C

 

 

 

 

C

C

 

 

 

 

 

 

D

D

 

 

 

 

D

D

图2

目标图像A像素区域对应的Q21Q22Q11Q12,以红色区域为原点向右下方扩展的2*2区域。

Q21

Q22

 

Q11

Q12

 

 

 

 

图3

目标图像B像素区域对应的Q21Q22Q11Q12,以蓝色区域为原点向右下方扩展的2*2区域。

 

Q21

Q22

 

Q11

Q12

 

 

 

图4

目标图像C像素区域对应的Q21Q22Q11Q12,以绿色区域为原点向右下方扩展的2*2区域。

 

 

 

 

Q21

Q22

 

Q11

Q12

图5

目标图像D像素区域对应的Q21Q22Q11Q12,目标图像处于最后两行的边界情况,将Q21Q22Q11Q12这四个点的值设为一样。

 

 

 

 

 

 

 

 

Q11=Q12=Q22=Q21

图6

 

 

程序流程图

流程图右边虚线框中为相关过程的注解。

posted on 2009-05-13 19:50 极品垃圾 阅读(566) 评论(0)  编辑 收藏 引用 所属分类: vc


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理