Loading... 图像处理之下采样 <!--more--> ## 下采样 下采样(subsampled)或降采样(downsampled))的目的有: 1、使得图像符合显示区域的大小; 2、生成对应图像的缩略图; 3、处理大型图像减少运算量。 ### 下采样实现 两种方式: 方法一,for循环隔行隔列循环遍历每一个像素点 ``` %读入图像进行下采样 %两种方法用时只需将对应方法注释掉其中一个即可 clear all; close all; clc; img = imread('F:\MATLAB2017b\AMOutputResults\lena.jpg'); % n为下采样倍数 n = 2; img = rgb2gray(img); [h w] = size(img); L =1; R = 1; %对图像进行下采样 tic; img_down = zeros(256,256); % %方法一循环遍历每一个像素点,j为行,i表示列 % for j = 1:n:h % for i = 1:n:w % img_down(L, R) = img(j,i); % R = R+1; % end % L = L+1; % R = 1; % end toc; %%%%%%%%%%%%%%%%%%%%%%%%% %tic; ``` 方法二,矩阵隔行隔列复制 其实道理也是一样的不过代码更短一些,在程序中间加了tic,toc来计时间, ``` %%方法二矩阵隔行隔列赋值 %img_down = img(1:n:512,1:n:512); %toc; imshowpair(img,(uint8(img_down)),'montage'); ``` 发现方法一:时间已过 0.002278 秒。方法二大概:时间已过 0.000293 秒。。。 第二种方法比第一种for循环快了将近10倍。可见在大型图片下采样时还是尽量避免for嵌套循环,转而用矩阵向量的计算方式,这样会省不少时间 。 ## DCT域下采样算法 在传统的图像,视频的后处理阶段,一般会涉及到图像大小的缩放问题。这样的操作是为了适配不同屏幕分辨率的大小。例如,对于高档相机拍摄的照片,一般都很大,而要在普通显示器上显示,则要在解码图像数据之后再做缩小操作才能显示到屏幕上。对于手机屏幕,更是如此。那么,能否在图像解码的过程中实现图片的缩小? 通过在视频解码中使用频域下采样技术,我们在400M主频的手机上实现了720p的流畅解码,在400M主频的CPU上实现了1080p的视频解码,但不是很流畅。 ### 1、DCT频率域下采样算法 ``` % 根据Dugad方法实现 %程序作者: celery.chen@yahoo.com.cn %2010-10-12 I=imread('456.png'); I=rgb2gray(I); figure(1); imshow(I); [width,height] = size(I); block_size_x = 8; block_size_y = 8; x_block_num = width/block_size_x; y_block_num = height/block_size_y; z_dst = zeros(width/2,height/2); pfun1 = @dct2; I_freq = blkproc(I,[8 8],pfun1); for i = 1: x_block_num for j = 1 : y_block_num P = I_freq((i-1)*8+1:(i-1)*8+4,(j-1)*8+1:(j-1)*8+4); P = P/2.0; z_dst( (i-1)*4 +1 : (i-1)*4 +4, (j-1)*4 +1 : (j-1)*4 +4) = P; end end pfun2 = @idct2; J = blkproc(z_dst,[4 4],pfun2); J = uint8(round(J)); figure(2); imshow(J); ``` ### 2、DCT频域下采样算法 ``` % dct频率域下采样算法,根据下面论文提到的算法实现 % 一种高效的DCT域图像下采样方法 中国图像图形学报 2005年4月 %程序作者: celery.chen@yahoo.com.cn ,2010-10 clc; clear; I=imread('456.png'); I=rgb2gray(I); figure(1); imshow(I); [width,height] = size(I); block_size_x = 8*2; block_size_y = 8*2; x_block_num = width/block_size_x; y_block_num = height/block_size_y; C16 = dctmtx(16); C16LL = C16(1:8,1:8); C16LH = C16(1:8,9:16); C16HL = C16(9:16,1:8); C16HH = C16(9:16,9:16); C8 = dctmtx(8); P = C16LL*C8'; P = P/sqrt(2); Q = C16LH*C8'; Q = Q/sqrt(2); E = (P + Q)/2; F = (P - Q)/2; z_dst = zeros(width/2,height/2); pfun1 = @dct2; I_freq = blkproc(I,[8 8],pfun1); for i = 1: x_block_num for j = 1 : y_block_num X1 = I_freq((i-1)*16+1:(i-1)*16+8,(j-1)*16+1:(j-1)*16+8); X2 = I_freq((i-1)*16+1:(i-1)*16+8,(j-1)*16+9:(j-1)*16+16); X3 = I_freq((i-1)*16+9:(i-1)*16+16,(j-1)*16+1:(j-1)*16+8); X4 = I_freq((i-1)*16+9:(i-1)*16+16,(j-1)*16+9:(j-1)*16+16); A = E*(X1+X3)+F*(X1-X3); B = E*(X2+X4)+F*(X2-X4); XLL = (A + B) * E' + (A - B) * F'; z_dst( (i-1)*8 +1 : (i-1)*8 +8, (j-1)*8 +1 : (j-1)*8 +8) = XLL; end end pfun2 = @idct2; J = blkproc(z_dst,[8 8],pfun2); J = uint8(round(J)); figure(2); imshow(J); ``` [参考文章-视频图像处理中的频域下采样技术](https://www.cnblogs.com/celerychen/archive/2013/06/05/3588198.html) 最后修改:2020 年 07 月 07 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏