圖像處理之下采樣

下采樣

下采樣(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方法實現
%程序作者: [email protected]
%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月
%程序作者: [email protected] ,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);

參考文章-視頻圖像處理中的頻域下采樣技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章