Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中两个rgb图像的相似性度量_Python_Similarity_Euclidean Distance - Fatal编程技术网

python中两个rgb图像的相似性度量

python中两个rgb图像的相似性度量,python,similarity,euclidean-distance,Python,Similarity,Euclidean Distance,我有两个相同大小的rgb图像,我想计算一个相似性度量。我想从欧几里德距离开始: import scipy.spatial.distance as dist import cv2 im1 = cv2.imread("im1.jpg") im2 = cv2.imread("im2.jpg") >> im1.shape (820, 740, 3) >> dist.euclidean(im1,im2) ValueError: Input vector should be

我有两个相同大小的rgb图像,我想计算一个相似性度量。我想从欧几里德距离开始:

import scipy.spatial.distance as dist
import cv2

im1 = cv2.imread("im1.jpg")
im2 = cv2.imread("im2.jpg")

>> im1.shape
(820, 740, 3)

>> dist.euclidean(im1,im2)

ValueError: Input vector should be 1-D.
我知道,
dist.euclidean
需要一个一维数组,而
im1
im2
是三维数组,但是有没有一个功能可以与三维数组一起工作,或者有没有可能将
im1
im2
转换成一个一维数组来保存图像中的信息?

你可以试试看

import scipy.spatial.distance as dist
import cv2
import numpy as np

im1 = cv2.imread("im1.jpg")
im2 = cv2.imread("im2.jpg")

dist.euclidean(im1.flatten(), im2.flatten())


您可以对两幅图像使用“重塑”功能,将它们从三维转换为一维

import scipy.spatial.distance as dist
import cv2

im1 = cv2.imread("im1.jpg")
im2 = cv2.imread("im2.jpg")

im1.reshape(1820400)
im2.reshape(1820400)

dist.euclidean(im1,im2)
灰度解(?) (下面讨论您对“保留图像中信息”功能的评论) 在我看来,您可能可以使用灰度图像而不是RGB图像来解决此问题。我知道我在做假设,但这是一个想法

我将尝试一个与您的代码相关的简单示例,然后给出一个使用2D离散傅里叶变换的图像相似性度量示例,该变换使用灰度转换。DFT分析将有自己的部分

(如果您在进行中看到此消息,我深表歉意。我只是想确保我的工作得到保存。)

基于我的假设,我将用一些RGB图像尝试你的方法,然后看看是否可以通过转换为灰度来解决这个问题。如果问题是用灰度解决的,我们可以通过使用所有三个通道的组合(每个通道分别进行比较)来找到图像相似性,从而分析灰度解决方案带来的信息损失量

方法

确保我有所有的库/包/你想叫它们的任何东西

> python -m pip install opencv-python
> python -m pip install scipy
> python -m pip install numpy
请注意,在本次试验中,我使用了一些PNG图像,这些图像是在尝试(如下所述)使用2D DFT时创建的

确保我遇到同样的问题

>导入scipy.spatial.distance作为dist
>>>进口cv2
>>>
>>>im1=cv2.imread(“rhino1_clean.png”)
>>>im2=cv2.imread(“rhino1_streak.png”)
>>>
>>>im1.1形状
(178, 284, 3)
>>>
>>>欧氏距离(im1,im2)
##一些追踪的东西##
ValueError:输入向量应为1-D。
现在,让我们尝试使用灰度。如果这样做有效,我们可以简单地找到每个RGB通道的距离。我希望它能起作用,因为我想做信息丢失分析

让我们转换为灰度:

>>im1\u gray=cv2.cvt颜色(im1,cv2.COLOR\u bgr2灰色)
>>>im2_gray=cv2.CVT颜色(im2,cv2.COLOR_BGR2GRAY)
>>>im1_灰色形状
(178, 284)
一个简单的
dist.euclidean(im1\u gray,im2,gray)
将导致相同的
值错误:输入向量应该是一维的。
例外,但我知道灰度图像数组(像素行数组)的结构,所以我做以下操作

>dists=[]
>>>对于范围(0,len(im1_灰色))内的i:
...   dists.append(dist.euclidean(im1\u gray[i],im2\u gray[i]))
...
>>>总和距离=总和(距离)
>>>平均距离=总距离/长度(距离)
>>>阿乌区
2185.9891304058297
顺便说一下,这是两张原始图像:

灰度(配合按摩)起作用,让我们试试颜色

按照此答案中的一些步骤,让我们执行以下操作


保存资料 在分析()之后,让我们看看我们的信息丢失。(请注意,这将是一个非常幼稚的分析,但我想尝试一下

灰度与颜色信息的对比

让我们看看颜色和灰度的对比。稍后,我们可以看看我们是否保留了关于距离的信息

使用灰度与所有三个通道对不同距离度量进行比较-使用一组图像的距离和比率进行比较。

我不知道如何对距离进行熵测量,但我的直觉告诉我,如果我使用灰度和颜色通道计算距离,如果我没有丢失任何信息,我应该得出类似的距离比率


看到这个问题时,我的第一个想法是使用二维离散傅里叶变换,我相信Python、NumPy或OpenCV中都有这种变换。基本上,DFT的第一个组件将与图像中的大形状相关。(我将在这里发表一篇相关的研究论文:。我没有仔细看——欢迎任何人提出其他建议。)

因此,让我查找一个容易从Python获得的二维DFT,然后我将返回到编写一些工作代码

(如果您在进行中看到此消息,我深表歉意。我只是想确保我的工作得到保存。)

首先,你需要确保你有
PIL
枕头
NumPy
。看起来你有
NumPy
,但这里有一些说明。(注意,我现在在Windows上)

现在,这里有5张图片-

  • 犀牛图片,
    rhino1_clean.jpg
    ()
  • 我在MS Paint中绘制的带有一些黑色条纹的相同图像,
    rhino1_streak.jpg

    另一张犀牛图片,
    rhino2_clean.jpg
    ()

    第一张河马图片
    hippo1_clean.jpg
    ()

    第二张河马图片,
    hippo2_clean.jpg
    ()

    所有图像均合理使用

    好的,现在,为了进一步说明,让我们转到Python交互终端

    >python

    导入PIL >>>将numpy作为np导入 首先,如果我们使用灰度PNG图像,生活会更轻松-PNG因为它是一个直位图(而不是压缩图像),灰度是因为我不必显示通道的所有细节

    >>rh\u img\u 1\u cln=PIL.Image.open(“rhino1\u clean.jpg”)
    >>>rh_img_1_cln.save(“rhino1_clean.png”)
    >>>rh\u img\u 1\u cln\u gs=PIL.Image.open(“rhino1\u clean.png”).convert(“LA”)
    >>>rh_img_1_cln_gs.save(“rhino1_clean_gs.png”)
    

    > python -m pip install opencv-python > python -m pip install numpy > python -m pip install pillow