python中两个rgb图像的相似性度量
我有两个相同大小的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
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
()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