对于图像(image interpolation) 和图像resize 相关知识的整理学习。

插值算法主要可以分为两类,一类是线性图像插值方法,另一类是非线性图像插值方法。传统的插值方法如最近邻插值,双线性插值以及双三次插值等都属于线性插值方法。这类插值方法在图像插值过程中采用同一种插值内核,不用考虑待插像素点所处的位置,这种做法会使图像中的边缘变得模糊不清,达不到高清图像的视觉效果。

非线性插值方法主要包括:基于小波系数的方法基于边缘信息的方法。其中,基于边缘信息的方法又可分为隐式方法和显式方法两种。隐式方法包含边缘导向插值(New edge directive interpolation,NEDI),最小均方误差估计插值(Linear minimum mean square-error estimation,LMMSE)、软判决自适应插值(Soft-decision adaptive interpolation interpolation,SAI),提出的边缘对比度引导的图像插值(Contrast-guideed image interpolation,CGI)等都是隐式的基于图像边缘的插值方法。

最新发展的话有基于决策树,深度学习,字典学习的图像插值算法。

线性插值算法常用有五种,在OpenCV中设置可以通过相关参数很方便地进行设置。

图像插值

缩小图像(下采样或者降采样)的主要目的:使得图像符合显示区域的大小;生成图像的缩略图。当图像像素数量减少时候,图像的质量不可避免受到影响。然而确实存在一些缩放方法能够增加图像的信息,从而使得缩放后的图像质量高于原图质量。

放大图像(上采样或者插值-image interpolating)主要目的是放大原图像,从而显示在更高的分辨率上。向上采样,可以指定插值算法来实现。

插值就是在不生成图像的情况下增加图像像素的一种方式,根据周围像素色彩使用数学方法计算丢失图像的色彩,插值并不能增加图像信息。

图像处理中常见的插值算法分类

1.传统差值原理和评价

在传统图像插值算法中,邻插值较简单,容易实现,早期的时候应用比较普遍。但是,该方法会在新图像中产生明显的锯齿边缘和马赛克现象。双线性插值法具有平滑功能,能有效地克服邻法的不足,但会退化图像的高频部分,使图像细节变模糊。在放大倍数比较高时,高阶插值,如双三次和三次样条插值等比低阶插值效果好。这些插值算法可以使插值生成的像素灰度值延续原图像灰度变化的连续性,从而使放大图像浓淡变化自然平滑。但是在图像中,有些像素与相邻像素间灰度值存在突变,即存在灰度不连续性。这些具有灰度值突变的像素就是图像中描述对象的轮廓或纹理图像的边缘像素。在图像放大中,对这些具有不连续灰度特性的像素,如果采用常规的插值算法生成新增加的像素,势必会使放大图像的轮廓和纹理模糊,降低图像质量。

2.基于边缘的图像插值算法

为了克服传统方法的不足, 提出了许多边缘保护的插值方法,对插值图像的边缘有一定的增强, 使得图像的视觉效果更好, 边缘保护的插值方法可以分为两类: 基于原始低分辨图像边缘的方法和基于插值后高分辨率图像边缘的方法。基于原始低分辨率图像边缘的方法:( 1)首先检测低分辨率图像的边缘, 然后根据检测的边缘将像素分类处理, 对于平坦区域的像素,采用传统方法插值;对于边缘区域的像素, 设计特殊插值方法, 以达到保持边缘细节的目的。(2)基于插值后高分辨率图像边缘的方法这类插值方法:首先采用传统方法插值低分辨率图像,然后检测高分辨率图像的边缘,最后对边缘及附近像素进行特殊处理, 以去除模糊, 增强图像的边缘。

3.基于区域的图像插值算法

首先将原始低分辨率图像分割成不同区域,然后将插值点映射到低分辨率图像, 判断其所属区域, 最后根据插值点的邻域像素设计不同的插值公式, 计算插值点的值。

  1. Common interpolation algorithms can be grouped into two categories: adaptive and non-adaptive.

Non-adaptive algorithms include: nearest neighbor, bilinear, bicubic, spline, sinc, lanczos and others. Depending on their complexity, these use anywhere from 0 to 256 (or more) adjacent pixels when interpolating. The more adjacent pixels they include, the more accurate they can become, but this comes at the expense of much longer processing time. These algorithms can be used to both distort and resize a photo.

Adaptive algorithms include many proprietary algorithms in licensed software such as: Qimage, PhotoZoom Pro, Genuine Fractals and others. Many of these apply a different version of their algorithm (on a pixel-by-pixel basis) when they detect the presence of an edge — aiming to minimize unsightly interpolation artifacts in regions where they are most apparent. These algorithms are primarily designed to maximize artifact-free detail in enlarged photos, so some cannot be used to distort or rotate an image. 能够检测边缘信息,然后根据这些信息选择不同的 interpolation 算法

线性插值详解

最近邻插值 (Nearest Neighbor Interpolation)

img

未知点和所有点中最近的一个。参考的是一个点的信息。

(单)线性插值(Linear Interpolation)

参考的是 两个点的信息。

已知数据 ($x_0$, $y_0$) 和 ($x_1, y_1$) ,求解的是($x, y$) $$ \frac{y-y_{0}}{x-x_{0}}=\frac{y_{1}-y_{0}}{x_{1}-x_{0}} $$

$$ y=\frac{x_{1}-x}{x_{1}-x_{0}} y_{0}+\frac{x-x_{0}}{x_{1}-x_{0}} y_{1} $$

上面比较好理解吧,仔细看就是用x和x0,x1的距离作为一个权重,用于y0和y1的加权。

双线性插值 (Bilinear Interpolation)

参考的是 4 个点的信息。

双线性插值本质上就是在两个方向上做线性插值。

已知Q11(x1,y1)、Q12(x1,y2)、Q21(x2,y1)、Q22(x2,y2),求其中点P(x,y)的值。

image-20210322150739042

(1) x方向单线性插值 直接带入前一步单线性插值最后的公式

$$ f\left(R_{1}\right)=\frac{x_{2}-x}{x_{2}-x_{1}} f\left(Q_{11}\right)+\frac{x-x_{1}}{x_{2}-x_{1}} f\left(Q_{21}\right) $$

$$ f\left(R_{2}\right)=\frac{x_{2}-x}{x_{2}-x_{1}} f\left(Q_{12}\right)+\frac{x-x_{1}}{x_{2}-x_{1}} f\left(Q_{22}\right) $$

(2) y方向单线性插值

$$ f(P)=\frac{y_{2}-y}{y_{2}-y_{1}} f\left(R_{1}\right)+\frac{y-y_{1}}{y_{2}-y_{1}} f\left(R_{2}\right) $$

最后整理可得 $$ f(x, y)=f\left(Q_{11}\right) w_{11}+f\left(Q_{21}\right) w_{21}+f\left(Q_{12}\right) w_{12}+f\left(Q_{22}\right) w_{22} $$ 每个点的权重:待求点和对角点的距离有关。

一篇文章为你讲透双线性插值

双三次插值 (Bicubic Interpolation)

参考的是 16 个点的信息。

图像的resize

经常说的像素,有时候却不注意其定义。

resolution = width x height

使用 PIL 软件,可以 resize 图像(可以保持长宽比例),比如下面的例子

1
2
img = cv2.imread('<name of image file>')
cv2.resize(img,fx=scaleX,fy=scaleY, interpolation = cv2.INTER_CUBIC)

给定一定的宽度,然后根据宽度去调整高度,按照上述规则去resize 图像。

如果想要在尺寸变小的情况下保持比较好的图像的质量,那么是可以使用 OpenCV 进行图像的预处理。(可以保持图像的质量)

1
2
img = cv2.imread('<name of image file>')
cv2.resize(img,fx=scaleX,fy=scaleY, interpolation = cv2.INTER_CUBIC)

Nearest Neighbor Scaling— This is the fastest and simplest to implement. This technique replaces every pixel with the nearest pixel in the output. When upscaling an image, multiple pixels of the same color will be duplicated throughout the image. For example let us say we have an image region of 2x2 blue pixels. When we upscale it to 3x3, we create 5 additional pixels, that have no color associated with it. Using Nearest Neighbor, the algorithm merely uses the blue pixel’s color to assign to the new pixels. One problem this can introduce are jagged edges or aliasing, so refining the process is required.

Bilinear — This interpolates pixels much better than Nearest Neighbor. It uses the same approach but the computation is much more complex. The technique will set the color or gray value of each pixel according to the nearest pixels. It takes a 2x2 or 4 pixel sample of the 4 nearest cells of the grid, and applies weights based on distance. Bilinear is not continuous over square boundaries, so the colors are not radially symmetric.

Bicubic Interpolation — This technique uses interpolation on a 2D grid of pixels. This is a much slower algorithm, since it takes time to process when resampling an image. Bicubic samples 4x4 or 16 pixels at a time. The results are much smoother looking images with less artifacts. This algorithm produces the best results out of the three discussed.

PIL提供了4种不同的采样滤波器:

① NEAREST:最近滤波。从输入图像中选取最近的像素作为输出像素。

② BILINEAR:双线性内插滤波。在输入图像的2*2矩阵上进行线性插值。

③ BICUBIC:双立方滤波。在输入图像的4*4矩阵上进行立方插值。

④ ANTIALIAS:平滑滤波。对所有可以影响输出像素的输入像素进行高质量的重采样滤波,以计算输出像素值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
im.resize()和im.thumbnail()用到了滤波器
方法一:resize(size,filter = None)
>>> from PIL import Image 
>>> im = Image.open('*.jpg')
>>> im.size
>>> im_resize = im.resize((256,256)) #default 情况下是NEAREST插值方法
>>> im_resize0 = im.resize((256,256), Image.BILINEAR)
>>> im_resize0.size
>>> im_resize1 = im.resize((256,256), Image.BICUBIC)
>>> im_resize2 = im.resize((256,256), Image.ANTIALIAS)

方法二:im.thumbnail(size,filter = None)

PIL 和cv2 的resize 效果对比

PIL 中比较好的是 Image.ANTIALIAS

很明显可以看出PIL默认的resize效果很差(中间),很多细节已经失真。加入Image.ANTIALIAS后,效果要比默认的好,但是在某些细节还是没有opencv默认的resize效果好。

cv2 中当压缩图像时候,比较好的是 CV_INTER_AREA;当放大图像比较好的是 CV_INTER_CUBIC。

To shrink an image, it will generally look best with CV_INTER_AREA interpolation, whereas to enlarge an image, it will generally look best with CV_INTER_CUBIC (slow) or CV_INTER_LINEAR (faster but still looks OK).

一般来说 cv2 中的CV_INTER_AREA 要比 PIL 中的 Image.ANTIALIAS 要好。

imagemagic 中常用的几个命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看图片属性的命令
identify **.png 

# 这个是convert resize 大小的命令
convert input.jpg -resize 300 output.jpg
convert input.jpg -resize 300 -quality 75 output.jpg

# 按照比例缩放
convert -resize 600×600 src.jpg dst.jpg

# 无序保持你原有的比例 (注意有一个 ! 号,并且是宽高 这样的顺序)
convert -resize 600×600! src.jpg dst.jpg

4.使用^命令后缀可以使用宽高中较小的那个值作为尺寸

convert -resize “300×300^” src.jpg dst.jpg

#此命令执行后,dst.jpg图片大小为(400×300),图片保持原有比例,(300:300 < 200:150,选择高作为最小尺寸)。

convert -resize “300×200^” src.jpg dst.jpg

#此命令执行后,dst.jpg图片大小为(300×225),图片保持原有比例,(300:200 > 200:150,选择宽作为最小尺寸)。

  • ImageMagiccv2 是比较好的实现工具;
  • 对于自己的图像,需要具体尝试不同的算法,使用多个数据源,然后对比不同的压缩效果。

强大的图像处理库(可以使用命令行哦)

Efficient Image Resizing With ImageMagick 图像插值笔记 JPEG Image Scaling Algorithms

Image warping

  1. 定义

Image warping is the process of digitally manipulating an image such that any shapes portrayed in the image have been significantly distorted. Warping may be used for correcting image distortion as well as for creative purposes (e.g., morphing[1]). The same techniques are equally applicable to video. 图像扭曲

Move pixels of an image

  1. 分类

Forward warping是在基于知道坐标的转换关系x(u,v)x(u,v)、y(u,v)y(u,v)后,直接把原图的每个坐标变换到新位置上,如果变换坐标(x,y)(x,y)不是整数,那么就按最近的取整。但问题是,新图中很多格子并没有对应到原图中的点上。

Inverse warping是对于每个获得的新坐标(x,y)(x,y),用逆向的映射函数u(x,y)u(x,y)、v(x,y)v(x,y)找到它在原图中对应的位置(u,v)(u,v),然后让g(x,y)=f(u,v)g(x,y)=f(u,v)。如果算出来的点(u,v)(u,v)不在格子上,就用插值方法获得像素值。

图像处理中的forward warping 和 inverse warping

Image Warping

Image Warping

Image Warping

  1. 应用

面部变形(Face Morph),这里面将要用到一种叫做扭曲(Image Warp)的图像变换技术。

Issues:  How do we specify where every pixel goes? (mapping)  How do we compute colors at dest pixels? (resampling)

How do we specify where every pixel goes? (mapping)

Parametric Mappings

  • Scale by factor:
  • Rotate by Θ degrees:
  • Any function of u and v:

Point Correspondence Mappings

  • Mappings implied by correspondences:
  • Beier & Neeley use pairs of lines to specify warp

How do we compute colors at dest pixels? (resampling) Image warping requires resampling of image

Point Sampling

  • Point filter
  • Triangle filter
  • Gaussian filter

Use nearest sample

图像的格式修改

如果是一张图片,那么从 png 转成 jpg,那么使用以下的命令

1
convert image.png image.jpg

如果是一批图片,那么使用以下的命令

it will keep the original as well as creating the converted image. As for batch. I think you need to use the Mogrify tool (from the same command line when in imagemagick). Keep in mind that this overwrites the old images. The command is:

1
mogrify -format jpg *.png  

批量修改 batch 操作

1
mogrify -resize 320x240! *.jpg