从参数的角度看视频图像和图片缩放

像素

像素是图像的基本单元,一个个像素就组成了图像。你可以认为像素就是图像中的一个点。

分辨率

  • 图像的分辩率是指图像的大小或尺寸。我们一般用像素个数来表示图像的尺寸。比如一张1920*1080的图像,前者1920指的是该图像的宽度方向上有1920个像素点,而后者1080指的是图像的高度方向上有1080个像素点。
  • 像素就是一个带有颜色的小块
  • 图像的分辨率越高,图像就越清晰(原始图像的话,越高越清晰,但是如果经过放大处理后的图像,分辨率很高,但是并不会很清晰,因为原始图像的像素点就那么多,放大后的图像,分辨率虽然增加了,但是增加的像素点的色值如何填充,填充什么就是靠"插值" 处理得到的,插值的像素是使用临近像素经过插值算法计算得到的,跟实际相机拍摄的像素是不一样的,相当于"脑补"出来的像素值。

位深

一般来说,我们看到的彩色图像中,都有三个通道,即R(红),G(绿),B(蓝)。有时候还有A(透明度)。
通常R,G,B各占8个位,也就是一个字节。8个位能表示256种颜色值,那3个颜色值的话就是256的3次方个颜色值,总共是1677万种颜色。我们称这种图像是8bit图像,而这个8bit就是位深
所以,位深越大,我们能表示的颜色就越多。因此,图像就可以更精确的展示你拍摄的真实世界。

Stride

Stride 不是图像本身的属性,但是视频开发者经常会碰到。Strider可以称为跨距,是图像存储的时候的概念。它指的是图像存储时内存中每行像素所占用的空间。 为了快速读取一行像素,我们一般会对内存中的图像实现内存对齐,比如16字节对齐。
举个例子,我们现在有一张 RGB 图像,分辨率是 1278x720。我们将它存储在内存当中, 一行像素需要 1278x3=3834 个字节,3834 除以 16 无法整除。因此,没有 16 字节对 齐。所以如果需要对齐的话,我们需要在 3834 个字节后面填充 6 个字节,也就是 3840 个字节做 16 字节对齐,这样这幅图像的 Stride 就是 3840 了。
这里要注意的一点是,每读取一行数据的时候需要跳过这多余的6个字节。如果没有跳过,这6个字节的像素就会被我们误认为是下一行开始的2个像素。这样得到的图像就完全错了,显示出来的就是"花屏"现象,屏幕会出现一条条的斜线。
所以,不管是读取还是渲染一张图片,还是说将这张图片存储下来,都需要设置正确的Stride.

帧率

1秒钟内图像的数量就是帧率。研究表明,一般帧率达到10~12帧每秒,人眼就会认为是流畅的了。通常,我们在电影院看的电影帧率一般是24fps,监控行业常用25fps。

码率

码率是指视频在单位时间内的数据量的大小,一般是1秒钟内的数据量,其单位一般是kb/s 或者 mb/s。通常,我们用压缩工具压缩同一个原始视频的时候,码率越高,图像的失真就会越小,视频画面就会越清晰。但同时,码率越高,存储时占用的内存空间就会越大,传输时使用的流量就会越多。不过,这个有个例外情况,如果你视频压缩选取的压缩算法不是很先进,那么你的码率会因
此变大,但是此时你的视频其实并没有比较清晰。

缩放的基本原理

图像的缩放就是将原头像已有的像素经过加权运算得到目标图像的目标像素。
如何将一个720P的图像放大到1280P?比如 720P图像上(1,1)这个点,对应到1280P上就是 (1.5,1.5)这个像素点。
那么同理 1280P上的(1,1)这个像素点,对应的就是原图像720P上的(0.6,0.6)这个点。这个点经过原图像周围点的插值算法计算得到对应的像素值就是1280P 上的(1,1)像素点。

最近邻插值

假设一个720P 的图像 放大到 1280P,取1280P 的3个目标像素点 分别是(0,0),(1,0),(2,2)。

  • 1080P 图像的(0,0)点 对应 720P 的 (0 * 1920/1280,0 * 1080/720) 即(0,0)这个点。 所以直接将(0,0)这个点赋值给 (0,0)
  • 1080P 图像的(1,0) 对应 720P 的 (1 * 1920/1280,0 *1080/720)即(0.67,0)这个点。(0.67,0)周围的四个点分别是(0,0),(1,0),(1,1),(0,1)。所以我们将原图的 (1,0)点像素赋值给放大后的图片的 (1,0)
  • 1080P 图像(2,2) 对应 720P 的 (2*1920/1280,2 *1080/720) 即(1.33,1.33)这个点。(1.33,1.33) 这个点四周的临近的点分别是(1,1),(2,2),(1,2),(2,1),这四个点中(1,1)距离(2,2)最近,所以将原像素的(1,1)像素赋值给(2,2)像素点。

双线性插值

双线性插值比最近邻插值要复杂一些。它也是取周围的4个点,然后通过一些算法计算得到最后的插值。
双线性插值其实就是三次线性插值的过程。先通过2次线性插值得到2个中间值,然后再通过对2次线性插值得到的结果,再做一次线性插值计算,得到最终的点的像素值。

你可能感兴趣的:(Android,音视频,音视频,计算机视觉)