图像的降采样与升采样(二维插值)----转自LOFTER-gengjiwen
图像的降采样与升采样(二维插值)
降采样,即是采样点数减少。对于一幅N*M的图像来说,如果降采样系数为k,则即是在原图中 每行每列每隔k个点取一个点组成一幅图像。降采样很容易实现.
升采样,也即插值。对于图像来说即是二维插值。如果升采样系数为k,即在原图n与n+1两点之间插入k-1个点,使其构成k分。二维插值即在每行插完之后对于每列也进行插值。
插值的方法分为很多种,一般主要从时域和频域两个角度考虑。对于时域插值,最为简单的是线性插值。除此之外,Hermite插值,样条插值等等均可以从有关数值分析书中找到公式,直接代入运算即可。对于频域,根据傅里叶变换性质可知,在频域补零等价于时域插值。所以,可以通过在频域补零的多少实现插值运算。
2、实现
其实在matlab中自带升采样函数(upsample)和降采样函数(downsample),读者可以查找matlab的帮助文件详细了解这两个函数。在这里,我重新写如下:
%========================================================
% Name: usample.m
% 功能:升采样
% 输入:采样图片 I, 升采样系数N
% 输出:采样后的图片Idown
% author:gengjiwen date:2015/5/10
%========================================================
function Iup = usample(I,N)
[row,col] = size(I);
upcol = col*N;
upcolnum = upcol - col;
uprow = row*N;
uprownum = uprow -row;
If = fft(fft(I).').'; %fft2变换
Ifrow = [If(:,1:col/2) zeros(row,upcolnum) If(:,col/2 +1:col)]; %水平方向中间插零
%补零之后,Ifrow为row*upcol
Ifcol = [Ifrow(1:row/2,:);zeros(uprownum,upcol);Ifrow(row/2 +1:row,:)]; %垂直方向补零
Iup = ifft2(Ifcol);
end
%========================================================
% Name: dsample.m
% 功能:降采样
% 输入:采样图片 I, 降采样系数N
% 输出:采样后的图片Idown
% author:gengjiwen date:2015/5/10
%========================================================
function Idown = dsample(I,N)
[row,col] = size(I);
drow = round(row/N);
dcol = round(col/N);
Idown = zeros(drow,dcol);
p =1;
q =1;
for i = 1:N:row
for j = 1:N:col
Idown(p,q) = I(i,j);
q = q+1;
end
q =1;
p = p+1;
end
end
% ===========================================
% 测试升采样和降采样的程序
% author:gengjiwen , date:2015/05/10
% 备注:测试完毕!
%============================================
clear;
close all;
I = imread('test1.jpg');
I = rgb2gray(I);
figure(1);
imagesc(I);
title('原图像');
% 图像降采样
figure;
for ii = 2:2:8
Idown = dsample(I,ii);
subplot(2,2,ii/2);
imagesc(Idown);
str = ['downsample at N = ' num2str(ii)];
title(str);
end
% 图像升采样
figure;
for ii = 2:2:8
Iup =usample(I,ii);
subplot(2,2,ii/2);
imagesc(abs(Iup));
str = ['upsample at N = ' num2str(ii)];
title(str);
end
测试结果如下:



3、结果分析
降采样没什么可说的,其实在matlab中可以很方便的用冒号运算符实现,具体可以查看下matlab自带函数downsample的实现。
对于升采样,这里用了频域方法实现。将原图像进行二维傅里叶变换,之后在变换后的中间补零插值,再反变换回时域。根据傅里叶变换性质可知,此时的时域插值核sinc函数的形式,对于二维,应是 二维sinc()函数。由于sinc函数的旁瓣比较大,故在升采样后的图像中会存在振铃现象。读者可以观察上面的实现结果图片。如果想减小这种情况,则可以对其进行频域加窗。
图像的降采样与升采样(二维插值)----转自LOFTER-gengjiwen的更多相关文章
- MATLAB二维插值和三维插值
插值问题描述:已知一个函数上的若干点,但函数具体表达式未知,现在要利用已知的若干点求在其他点处的函数值,这个过程就是插值的过程. 1.一维插值 一维插值就是给出y=f(x)上的点(x1,y1),(x2 ...
- matlab学习——05插值和拟合(一维二维插值,拟合)
05插值和拟合 1.一维插值 (1) 机床加工零件,试用分段线性和三次样条两种插值方法计算.并求x=0处的曲线斜率和13<=x<=15范围内y的最小值. x0=[0 3 5 7 9 11 ...
- 用Python实现根据角4点进行矩阵二维插值并画出伪彩色图
哈哈,题目取得这么绕,其实就是自己写了一个很渣的类似图像放大的算法.已知矩阵四周的4点,扩展成更大的矩阵,中间的元素值均匀插入,例如: 矩阵: 1 2 3 4 扩展成3x3的: 1 1.5 2 ...
- 利用griddata进行二维插值
有时候会碰到这种情况: 实际问题可以抽象为 \(z = f(x, y)\) 的形式,而你只知道有限的点 \((x_i,y_i,z_i)\),你又需要局部的全数据,这时你就需要插值,一维的插值方法网上很 ...
- matlab二维插值--interp2与griddata
二者均是常用的二维插值方法,两者的区别是, interp2的插值数据必须是矩形域(X,Y必须分别是单调向量),即已知数据点(x,y)组成规则的矩阵,或称之为栅格,可使用meshgid生成. gridd ...
- 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换
在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...
- ZXing 生成、读取二维码(带logo)
前言 ZXing,一个支持在图像中解码和生成条形码(如二维码.PDF 417.EAN.UPC.Aztec.Data Matrix.Codabar)的库.ZXing(“zebra crossing”)是 ...
- java程序生成二维码
在物联网的时代,二维码是个很重要的东西了,现在无论什么东西都要搞个二维码标志,唯恐落伍,就差人没有用二维码识别了.也许有一天生分证或者户口本都会用二维码识别了.今天心血来潮,看见别人都为自己的博客添加 ...
- [opencv]二维码识别率提升方案-resize调整
这里采用循环resize的方式,对二维码图像进行放缩. 识别到name(二维码结果)不为空,则立即退出循环 //循环识别 for (int i = 1;name.empty(); i++){ resi ...
随机推荐
- android stuido - 关闭单词拼写检查
"File"-"Settings"-"Editor "-"Inspections" 在Spelling栏取消选中,再点击 ...
- JavaScript Array 对象方法
data.sort(function(a,b){return a.time>b.time?1:-1}); http://www.w3school.com.cn/jsref/jsref_obj_a ...
- CEdit 控制键盘操作
写在前面的话:在工作中要实现这样一个功能,在一个树形控件中选择要发送消息的客户,添加到一个列表控件中,点击确定跳到一个信息发送页面如下图,在发送人编辑框中显示选择的客户,要实现的就是即允许用户删除用户 ...
- 解决Django中在.js文件中用ajax请求后端,找不到CSRF问题
function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != ...
- 简单的java程序
1.二分查找,java的输入与输出 package com; public class Firstapp{ public static void main(String args[]) { java. ...
- javascript 中解析json
首先温习一下JSON格式: (1) 单个对象{"变量名1":"变量值1","变量名2":"变量值2"} (2) 数组[{ ...
- phpexcel导出乱码
在输出到浏览器时,要在head前加ob_end_clean();参考此文, ob_end_clean(); header('Content-Type: application/vnd.ms-excel ...
- hdu 5215 Cycle
题意:找到一个图中是否含有奇环和偶环 题解: 1.用了两种发法.一个就是跟bc给的答案一样,先求弱联通分量.再在环中找奇偶环 2.我想到的一个略微省些代码量的方法.边求联通分量,边推断是否含有奇环偶环 ...
- silverlight调用WebService传递json接收绑定数据
1.接收数据: WebService通过接口接收数据.类型为object 2.类型转换: 通过json转换方法将object转换为json格式数据 3.调用WebService方法: silverli ...
- 轻量级ORM框架Dapper应用三:使用Dapper实现In操作
IN 操作符允许我们在 WHERE 子句中规定多个值. 本篇文章中,还是使用和上篇文章中同样的实体类和数据库,Dapper使用in操作符的代码如下: using System; using Syste ...