加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 点评 > 正文

产品讲技术 | 带你看懂什么是计算机视觉(一)

发布时间:2020-02-22 11:10:14 所属栏目:点评 来源:做站长
导读:做为一名5岁的AI产品汪,刚好利用春节(疫情)假期在家整理了一些CV的文章,发现网上的资料质量参差不齐,内容缺斤少两,小白很难甄别/读懂,想对CV有一个系统的认识很难,就自己做了一个系统总结(小白可以当教材看)。 本人并非CV领域专业人士(产品经理

一个完整的几何变换需要两部分运算:除了空间变换所需的运算外,还需要使用灰度插值算法。因为按照几何变换关系进行计算,输出图像的像素可能被映射到输入图像的非整数坐标上。而像素做为最小显示单位(矢量图形不是由像素构成的,矢量可以是一个点或一条线),我们要为输出图像找到最合适的整数像素点。

1.2.6 什么是灰度插值算法?

灰度插值算法,通常采用的方法有最近邻插值、双线性插值和双三次插值。在讲插值算法之前,我们先来看下图像的缩放问题。

传统的绘图工具中,有一种叫做“放大尺”的绘图工具,画家常用它来放大图画。在计算机上,我们将不再需求用放大尺去放大或缩小图像了,把这个工作交给程序来完成就可以了。

我们所说的图像都是指点阵图,也就是用一个像素矩阵来描述图像的方法,对于另一种图像:用函数来描述的图像的矢量图,不再本文讨论之列。

图像放大时,像素也相应地增加,但这些增加的像素从何而来?

这时插值就派上用场了:插值就是在不生成像素的情况下增加图像像素大小的一种方法,在周围像素色彩的基础上用数学公式计算丢失像素的色彩。

所以在放大图像时,图像看上去会比较平滑、干净,但必须注意的是插值并不能增加图像信息。

目的:因为图像空间变换不改变图像的像素值,只是对图像的像素值重新进行映射,在表示映射关系时,输出图像的像素可能被映射到输入图像的非整数坐标上,灰度插值算法就是为输出图像找到最合适的整数像素坐标。

在知道什么是插值后,让我们来一起看一下常用的插值算法的原理。

(1)最近邻插值法 Nearest Neighbour Interpolate

是最简单的一种插值算法,也称作零阶插值,就是令变换后像素的灰度值等于距它最近的输入像素的灰度值。也就是说照搬旁边的像素这样做结果,会产生明显可见的锯齿,在待求像素的四邻像素中,将距离待求像素最近的邻灰度值赋给待求像素。

设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰度的值 f(i+u, j+v)

如下图所示:

产品讲技术 | 带你看懂什么是计算机视觉(一)

如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素。同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。最邻近元法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

最近邻插值法实现的效果如下所示:

产品讲技术 | 带你看懂什么是计算机视觉(一)

从效果图上,可以看到明显的锯齿,这就是因为最近邻插值法不断在复制最近邻像素灰度值的原因,假设A、B、C、D为四个不同的像素点,现在把输入图像扩大4倍:

产品讲技术 | 带你看懂什么是计算机视觉(一)

输出图像就由原来的4个像素点变成了16像素点,而新增的12个像素点并不是图像新的真实像素,而是复制图像邻近像素产生的,就很容易出现锯齿这种图像失真现象。

(2)双线性插值Bilinear Interpolation

1)双线性插值

假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(i*m/a,j*n/b)。

显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。如果你的对应坐标是(2.5,4.5),那么最近的四个像素是(2,4)、(2,5)、(3,4),(3,5)。

若图像为灰度图像,那么(i,j)点的灰度值可以通过一下公式计算:

f(i,j)=w1*p1+w2*p2+w3*p3+w4*p4;

其中,pi(i=1,2,3,4)为最近的四个像素点,wi(i=1,2,3,4)为各点相应权值。关于权值的计算,在维基百科和百度百科上写的很明白。

2)存在的问题

这部分的前提是,你已经明白什么是双线性插值并且在给定源图像和目标图像尺寸的情况下,可以用笔计算出目标图像某个像素点的值。

当然,最好的情况是你已经用某种语言实现了网上一大堆博客上原创或转载的双线性插值算法。然后发现计算出来的结果和matlab、openCV对应的resize()函数得到的结果完全不一样。

那这个究竟是怎么回事呢?

其实答案很简单,就是坐标系的选择问题,或者说源图像和目标图像之间的对应问题。

按照网上一些博客上写的,源图像和目标图像的原点(0,0)均选择左上角,然后根据插值公式计算目标图像每点像素。

假设你需要将一幅5×5的图像缩小成3×3,那么源图像和目标图像各个像素之间的对应关系如下:

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读