对图像进行上采样和下采样的最佳方法

Posted

技术标签:

【中文标题】对图像进行上采样和下采样的最佳方法【英文标题】:Best way to Upsampling and Downsampling Image 【发布时间】:2014-05-04 05:12:06 【问题描述】:

我的图像尺寸为 300x300。为了更快的计算时间,我使用了下采样

 I=imresize(originalImage,0.5);

之后,我想恢复它

 outputImage=imresize(I,2);

但我看到输出图像与原始图像不相似。在matlab中上下采样的最佳方法是什么?它将返回原始图像和输出图像之间的最小误差(下采样和上采样后) 非常感谢

【问题讨论】:

【参考方案1】:

您不应该期望完全恢复较大的图像。如果这是可能的,我们可以通过存储下采样图像并放大它们来无损压缩图像。但是,当图像被下采样时,一些信息会丢失,这些信息根本无法恢复。如果出于运行时原因需要对图像进行下采样,请确保在需要时保留原始图像的副本。 matlab imresize 函数提供了多种执行插值的方法。可以测试特定内核的下采样/上采样操作导致的错误:

I = int8(imread('rice.png'));

J = imresize(imresize(I,0.5,'box'),2,'box');
mean(abs(J(:) - I(:)))

使用不同的内核类型运行此代码会产生:

box
4.132904052734375
triangle
4.843124389648438
cubic
4.094940185546875
lanczos2
4.088195800781250
lanczos3
3.948623657226562

Lanczos3 似乎对这张图片有最小的错误,这并不奇怪。它也可能是最慢的。

【讨论】:

【参考方案2】:

如果您专注于下采样一半(上采样 2)的特殊情况,请使用impyramid

I1 = impyramid(I0, 'reduce');
Ix = impyramid(I1, 'expand');

【讨论】:

效果不错。但检查它不会恢复相同大小的原始图像。您可以在 matlab 中查看此代码:>> I0=[1 2 3 4;5 6 6 6; 7 6 5 6; 2 4 6 8];>>I1 = impyramid(I0, 'reduce'); >> Ix = impyramid(I1, '展开'); Ix 尺寸仅为 3x3。它看起来不像 I0 尺寸 4x4。如何解决?谢谢楼主 @user3336190 老实说,我只使用过reduce,所以我从未在文档中注意到expand 提供(2*M-1)-by-(2*N-1)。不确定是否有解决方法,抱歉。 Chappjc:没问题。您对小误差的上下采样有什么想法吗?我只知道一种方法是 imresize() 函数 @user3336190 imresize 是一个好方法,但请注意,下采样时的抗锯齿可能会或可能不会对错误有益。作为参考,如果您想手动进行采样(使用interp2),请参阅my resizeim function from a previous post。除了边缘在imresize 中得到特殊处理外,输出等效于imresize 禁用抗锯齿。

以上是关于对图像进行上采样和下采样的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

步骤用于高度不平衡的分类步骤。我应该对数据进行上采样和下采样,还是对不平衡的类进行上采样

图像的上采样(up-sampling)和下采样(down-sampling)

python使用imbalanced-learn的SMOTETomek方法同时进行上采样和下采样处理数据不平衡问题

python使用imbalanced-learn的SMOTEENN方法同时进行上采样和下采样处理数据不平衡问题

如何在 python 或 MATLAB 中对 ECG 信号进行上采样和下采样?

重采样上采样下采样