现在的位置: 首页 > 综合 > 正文

视频图像处理中的频域下采样技术

2012年12月09日 ⁄ 综合 ⁄ 共 2728字 ⁄ 字号 评论关闭

本文转自:http://blog.csdn.net/celerychen2009/article/details/9028145

 在传统的图像,视频的后处理阶段,一般会涉及到图像大小的缩放问题。这样的操作是为了适配不同屏幕分辨率的大小。例如,对于高档相机拍摄的照片,一般都很大,而要在普通显示器上显示,则要在解码图像数据之后再做缩小操作才能显示到屏幕上。对于手机屏幕,更是如此。那么,能否在图像解码的过程中实现图片的缩小?答案是肯定的。网上开源的jpeg项目早就实现了频域下采样技术。美图秀秀,QQlive等多款桌面图片应用软件也采用了这项技术,并宣称对大图的加载速度快了好几倍。不过,QQlive居然直接使用了这个库!

    

        通过在视频解码中使用频域下采样技术,我们在400M主频的手机上实现了720p的流畅解码,在400M主频的CPU上实现了1080p的视频解码,但不是很流畅。

        频域下采样技术并不是多么高深的算法,下面的matlab代码十分简洁的描述了图像的频域下采样过程。

1.  DCT域下采样算法   

代码测试时,‘456.png’是一幅彩色图像

  1. % dct频率域下采样算法  
  2. % 根据Dugad方法实现  
  3. %程序作者: celery.chen@yahoo.com.cn  
  4. %2010-10-12  
  5.   
  6. I=imread('456.png');
               
  7. I=rgb2gray(I);  
  8. figure(1);  
  9. imshow(I);  
  10. [width,height] = size(I);  
  11. block_size_x = 8;  
  12. block_size_y = 8;  
  13. x_block_num = width/block_size_x;  
  14. y_block_num = height/block_size_y;  
  15.   
  16.   
  17. z_dst = zeros(width/2,height/2);  
  18.   
  19. pfun1 = @dct2;  
  20.   
  21. I_freq = blkproc(I,[8 8],pfun1);  
  22.   
  23.   
  24. for i = 1: x_block_num  
  25.     for j = 1 : y_block_num  
  26.           
  27.         P = I_freq((i-1)*8+1:(i-1)*8+4,(j-1)*8+1:(j-1)*8+4);  
  28.         P = P/2.0;  
  29.         z_dst( (i-1)*4 +1 : (i-1)*4 +4, (j-1)*4 +1 : (j-1)*4 +4) = P;    
  30.        
  31.     end  
  32.  end  
  33.   
  34. pfun2 = @idct2;  
  35.   
  36. J = blkproc(z_dst,[4 4],pfun2);  
  37. J = uint8(round(J));  
  38. figure(2);  
  39. imshow(J);  

2. 另外一种DCT频域下采样算法

  1. % dct频率域下采样算法,根据下面论文提到的算法实现  
  2. % 一种高效的DCT域图像下采样方法 中国图像图形学报 2005年4月  
  3. %程序作者: celery.chen@yahoo.com.cn ,2010-10  
  1. clc;  
  2. clear;  
  3. I=imread('456.png');  
  4. I=rgb2gray(I);  
  5. figure(1);  
  6. imshow(I);  
  7. [width,height] = size(I);  
  8. block_size_x = 8*2;  
  9. block_size_y = 8*2;  
  10. x_block_num = width/block_size_x;  
  11. y_block_num = height/block_size_y;  
  12.   
  13.   
  14. C16 = dctmtx(16);  
  15.   
  16.  C16LL = C16(1:8,1:8);  
  17.  C16LH = C16(1:8,9:16);  
  18.  C16HL = C16(9:16,1:8);  
  19.  C16HH = C16(9:16,9:16);  
  20.    
  21.  C8 = dctmtx(8);  
  22.    
  23.  P = C16LL*C8';  
  24.  P = P/sqrt(2);  
  25.     
  26.  Q = C16LH*C8';  
  27.  Q = Q/sqrt(2);  
  28.    
  29.   E = (P + Q)/2;  
  30.   F = (P - Q)/2;  
  31.   
  32.   
  33.   
  34. z_dst = zeros(width/2,height/2);  
  35.   
  36. pfun1 = @dct2;  
  37.   
  38. I_freq = blkproc(I,[8 8],pfun1);  
  39.   
  40.   
  41. for i = 1: x_block_num  
  42.     for j = 1 : y_block_num  
  43.           
  44.         X1 = I_freq((i-1)*16+1:(i-1)*16+8,(j-1)*16+1:(j-1)*16+8);  
  45.                 X2 = I_freq((i-1)*16+1:(i-1)*16+8,(j-1)*16+9:(j-1)*16+16);  
  46.                   
  47.                 X3 = I_freq((i-1)*16+9:(i-1)*16+16,(j-1)*16+1:(j-1)*16+8);  
  48.                 X4 = I_freq((i-1)*16+9:(i-1)*16+16,(j-1)*16+9:(j-1)*16+16);          
  49.                   
  50.                   
  51.                 A  = E*(X1+X3)+F*(X1-X3);  
  52.                 B  = E*(X2+X4)+F*(X2-X4);  
  53.                   
  54.                 XLL = (A + B) * E' + (A - B) * F';  
  55.   
  56.         z_dst( (i-1)*8 +1 : (i-1)*8 +8, (j-1)*8 +1 : (j-1)*8 +8) = XLL;    
  57.        
  58.     end  
  59.  end  
  60.   
  61. pfun2 = @idct2;  
  62.   
  63. J = blkproc(z_dst,[8 8],pfun2);  
  64. J = uint8(round(J));  
  65. figure(2);  
  66. imshow(J); 

抱歉!评论已关闭.