常用的像素操作算法:Resize、Flip、Rotate

Resize

图像缩放是把原图像按照目标尺寸放大或者缩小,是图像处理的一种。

图像缩放有多种算法。最为简单的是最临近插值算法,它是根据原图像和目标图像的尺寸,计算缩放的比例,然后根据缩放比例计算目标像素所依据的原像素,过程中自然会产生小数,这时就采用四舍五入,取与这个点最相近的点。

除此之外,还有双线性插值算法。

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。

其公式如下:f(i+u,j+v) =(1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1)

其中U和V表示浮点坐标的小数部分,显然离目标点距离越近的点的权重越大,这也正符合目标点的值与离他最近的点最接近这一事实。

cv4j的resize目前支持这两种算法。通过Resize类的源码,可以看到有两个常量

使用最临近插值算法,将原图缩小到0.75倍。

使用双线性插值算法,将原图放大2倍。

效果如下:

Flip

Flip是翻转的意思,也被称为镜像变换。又可以分为水平镜像和垂直镜像,水平镜像即将图像左半部分和右半部分以图像竖直中轴线为中心轴进行兑换,而竖直镜像则是将图像上半部分和下半部分以图像水平中轴线为中心轴进行兑换。

flip的算法很简单

实现具体的左右翻转

实现具体的上下翻转

效果如下:

Rotate

图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程。当然这个点通常就是图像的中心。既然是按照中心旋转,自然会有这样一个属性:旋转前和旋转后的点离中心的位置不变。

图像的旋转是图像几何变换的一种,旋转前后的图像的像素的RGB都是没有改变的,改变的只是每一个像素的所在位置。

cv4j提供两种旋转的算法:NormRotate和FastRotate

下面以NormRotate为例,使用起来很简单,旋转120度,背景为红色。

效果如下:

总结

cv4j (https://github.com/imageprocessor/cv4j)是gloomyfish (http://blog.csdn.net/jia20003)和我一起开发的图像处理库,纯java实现,我们已经分离了一个Android版本和一个Java版本。

像素操作是 cv4j 的基本功能之一,本文介绍了三种常见的变换。我们可以通过图像的Resize、Flip、Rotate变换来丰富图片数据的多样性。

如果您想看该系列先前的文章可以访问下面的文集:http://www.jianshu.com/nb/10401400

关注【Java与Android技术栈】

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171214G0OUGE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券