对图像进行上采样和下采样的最佳方法
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方法同时进行上采样和下采样处理数据不平衡问题