首页天道酬勤opencv图像匹配(opencv 目标识别)

opencv图像匹配(opencv 目标识别)

admin 12-25 04:36 208次浏览

摘要:本文使用opencv。 numpy等简单的工具库基于mse和ssim两种算法评价两张图像的相似度,容易理解和实践。

介绍

作为人类,我们通常很善于发现图像的差异。 例如,常见游戏——的两张图片寻找差异。 玩这个游戏吧。 让我们先看看上面的图片。 让我们看看30秒内有没有什么不同的地方。

答:水果、冰淇淋、饮料的颜色发生了明显的变化,窗帘、太阳也发生了变化。 这很容易吗? 如果有补充的回答,请在信息处发出哦!

这样的问题对人类来说看似简单,但对计算机来说并不容易。 这是因为计算机只能从我们训练的模型中学习,所以最终拥有这样的能力。 目前有许多优秀的模型可以对批处理图像进行分类,如TensorFlow和Keras等开源工具。

通过这样的开源工具库,计算机视觉领域的研究得到了高度的发展。 现在也可以使用这样的工具箱制作非常复杂的模型,解决kaggle:Animals-10这样的复杂问题。 这个数据集包含几十种动物的图像和非动物的图像。 需要做的是建立一个模型来预测图像是什么类型的动物。

MSE和SSIM

但是,上述任务比较简单,例如常见的手写数字识别MNIST等,一般也能得到较高的精度。 在这里,我想做一个图像分类器,稍微增加一下难度,区分两个图像的相似度。 另外,不依赖于TensorFlow、Keras等复杂的工具库。 本文采用传统的机器学习方法,从这里选择两种方法,看看图像是否与其他图像相似。 这两种方法分别是均方根误差(MSE )、结构相似度指数) SSIM )。

MSE

SSIM

上述公式看起来非常复杂,但请不要害怕。 根据NumPy,可以相当简单地计算MSE; 另外,因为SSIM是Sci-Kit对象库内置方法的一部分,所以SSIM也可以容易地计算出来。

在进行编码之前,这里将简要介绍这两种方法。 MSE计算要比较的两个图像的每个像素之间的均方误差。 SSIM做和MSE正相反的事,寻找像素值的相似之处。 也就是说,如果两个图像的像素阵列相似,或者像素密度值相似。 MSE法面临的问题之一是,其结果往往具有任意大的值,因此很难给出标准的评价标准。 一般来说,MSE越高,表示两张图像的相似度越低。 图像间的MSE值为随机值时,很难说明两者是否相似。 另一方面,SSIM将所有内容标准化在-1~1的范围内(很难得到小于0的分数)。 得分为1时表示两者非常相似,得分为-1时表示两者非常不同。 由此可见,SSIM是比MSE更好的测量指标。

实现

目前,使用代码实现上述想法:

加载所需的库:

本文利用常用的图像处理工具箱OpenCV实现图像的读取和编辑。 如果您熟悉其他图像处理工具箱,也可以使用熟悉的工具箱(如matplotlibden )执行这些操作。

创建MSE表达式:

使用Numpy很简单吧。

因为SSIM已经在skimage中导入,所以不需要手动编码。 现在做一个

比较函数,该函数的输入为两个图像,分别计算二者的MSE和SSIM,并展示计算结果。

下面的三个步骤可以使用for循环一次完成,但是为了更容易地理解,这里不使用for循环编写代码,将其分解为三个部分:

首先,加载保存在目录中的图像。其次,必须确保它们的大小相同,否则会出现尺寸不匹配的错误。问题是对其进行尺寸变换操作会导致图像失真,所以在找到比较合适的尺寸数字之前,可以尝试快速搜索方法,尺寸大小按照一定的规律设置,不断实验以找到最终比较合适的尺寸。接下来我们再实现一个功能,以便于看到测试图像是什么样子的。

现在通过比较两个一样的图像来测试并查看MSE和SSIM是否正常工作。如果它有效,那么我们应该得到MSE值为0和SSIM值为1的结果。

从中可以看到,代码正确,结果与猜想的一致!

现在计算机就可以判断比较的两张图像是否相同了。为简单起见,我将三张狗的图像与自己以及三张猫的图像进行比较。

三只不同的狗比较

三只不同的猫比较

下面看看两种算法的性能比较。正如所看到的那样,MSE的值变化很大,因此该值很难说明其表达的意思是什么。但从SSIM的结果看出,可以看到狗2和狗3相对于其他狗的图像最为相似。从视觉上来讲,我同意这个结果,因为两只狗的耳朵非常像。但我还会认为狗1和狗3会有更高的SSIM值,因为二者的姿势也很相似。实际上,在图像没有进行灰度处理之前,狗2和狗3在鼻子区域周围有类似的白色毛皮,而狗1没有。这很可能是狗2和3具有比狗1更高的SSIM值的原因。对于猫来说,这就有点困难。猫1和猫2具有相似的形状,并且图像是从相似的距离拍摄的,但猫2和猫3具有相似的皮毛颜色。

这里我想进行的测试只有两个:一个是狗和猫的相似性,第二个是每个动物与原始源代码附带的门图的相似性。

正如所预料的那样,狗和猫是相似的,这点与与无生命的物体相比呈鲜明的对比,如侏罗纪公园入口门。狗和猫对门的图像具有较高的SSIM值,唯一原因在于图像都经过了尺寸缩放和灰度处理。

在调整图像大小和重新配置时,OpenCV并不是最好的。一般而言,TensorFlow是最好的,TensorFlow也最适合批量图像。

之后,我也将使用TensorFlow处理kaggle Animal-10数据集,来实现一个完整的图像分类器。

作者信息

Iftekher Mamun, 机器学习

本文由阿里云云栖社区组织翻译。

文章原标题《Image Classification using SSIM

Simple Image Classifier with OpenCV》,译者:海棠,审校:Uncle_LLD。

聊聊spring继承的问题跨端开发框架对比(跨平台前端框架)DeepRust匹配:有更好的方法吗?C++构造析构赋值运算函数怎么应用雷士灯具管理系统
python logging模块(python中sys模块) opencv去除视频水印(python opencv 教程)
相关内容