OpenCV滤波器进行缩减像素采样

OpenCV滤波器进行缩减像素采样,需要调整图像精度(重新采样)的情况屡见不鲜,降低图像精度的过程称为缩减像素采样(downsampling),提升图像精度的过程称为提升像素采样(upsampling)。这些算法的难点在于要尽可能地保持图像质量。为此,人们通常采用低通滤波器来实现算法,

如何实现

你也许会觉得,要缩小一幅图像,只需简单地消除图像中的一部分行和列就可以了。可惜,这么做得到的图像效果很差。下面的图片说明了这点,它是将测试用的图像缩小到1/4后得到的,方法是只保留每四行(列)像素中的一行(列)。

注意,为了让图像的缺陷看起来更明显,将每个像素按原大小的四倍进行显示。
OpenCV滤波器进行缩减像素采样

可以发现,这幅图像的质量明显降低了,例如原始图像中城堡顶部倾斜的边缘在缩小后的图像中看起来像是楼梯。图像的纹理部分也能看到锯齿状的变形(如砖墙)。

这些令人讨厌的伪影是一种叫作空间假频的现象造成的。当你试图在图像中包含高频成分,但由于图像太小而无法包含时,就会出现这种现象。实际上,在小图像(即像素较少的图像)中展现精致纹理和尖锐边缘的效果不如在较高分辨率的图像中展现它们的效果好(想想高清电视机和普通电视机的差别)。图像中精致的细节对应着高频,因此需要在缩小图像之前去除它的高频成分。

通过上文的学习,我们知道这可以用低通滤波器实现。因此在删除部分列和行之前,必须先在原始图像上应用低通滤波器,这样才能使图像在缩小到四分之一后不出现伪影。这是用OpenCV的实现方法:

// 首先去除高频成分
cv::GaussianBlur(image, image, cv::Size(11,11),2.0);
// 只保留每4 个像素中的1 个
cv::Mat reduced(image.rows/4, image.cols/4, CV_8U);
for (int i=0; i<reduced.rows; i++)
  for (int j=0; j<reduced.cols; j++)
       reduced.at<uchar>(i, j)= image.at<uchar>(i*4, j*4);

得到的图像如下所示(放大四倍显示)。

OpenCV滤波器进行缩减像素采样

当然了,这幅图像丢失了一些精致的细节,但从总体上看,它的视觉质量比前面的要好(从远处看就会发现,这幅图像的质量确实好多了)。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!