前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图像处理-下采样

图像处理-下采样

作者头像
AomanHao
发布2022-01-14 08:35:40
7200
发布2022-01-14 08:35:40
举报
文章被收录于专栏:ISP图像处理相关

图像处理之下采样

下采样

下采样(subsampled)或降采样(downsampled))的目的有:

1、使得图像符合显示区域的大小; 2、生成对应图像的缩略图; 3、处理大型图像减少运算量。

下采样实现

两种方式: 方法一,for循环隔行隔列循环遍历每一个像素点

代码语言:javascript
复制
%读入图像进行下采样
%两种方法用时只需将对应方法注释掉其中一个即可
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来计时间,

代码语言:javascript
复制
%%方法二矩阵隔行隔列赋值
%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频率域下采样算法

代码语言:javascript
复制
% 根据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频域下采样算法

代码语言:javascript
复制
% 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);

参考文章-视频图像处理中的频域下采样技术

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020 年 03 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 下采样
    • 下采样实现
    • DCT域下采样算法
      • 1、DCT频率域下采样算法
        • 2、DCT频域下采样算法
        相关产品与服务
        图像处理
        图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档