当前位置: 首页 > 面试题库 >

推土机距离的Python代码

葛宪
2023-03-14
问题内容

我正在寻找Python中的地球移动器的距离(或快速EMD)实现。关于在哪里找到它的任何线索,我在网上已经看够了。我想在我正在做的图像检索项目中使用它。谢谢。

编辑:我发现了使用纸浆库的一个非常好的解决方案。该页面还包含设置所需的说明。


问题答案:

OpenCv for
Python中有一个出色的实现。该函数的名称为CalcEMD2,用于比较两个图像直方图的简单代码如下所示:

#Import OpenCv library
from cv2 import *

### HISTOGRAM FUNCTION #########################################################
def calcHistogram(src):
    # Convert to HSV
    hsv = cv.CreateImage(cv.GetSize(src), 8, 3)
    cv.CvtColor(src, hsv, cv.CV_BGR2HSV)

    # Extract the H and S planes
    size = cv.GetSize(src)
    h_plane = cv.CreateMat(size[1], size[0], cv.CV_8UC1)
    s_plane = cv.CreateMat(size[1], size[0], cv.CV_8UC1)
    cv.Split(hsv, h_plane, s_plane, None, None)
    planes = [h_plane, s_plane]

    #Define numer of bins
    h_bins = 30
    s_bins = 32

    #Define histogram size
    hist_size = [h_bins, s_bins]

    # hue varies from 0 (~0 deg red) to 180 (~360 deg red again */
    h_ranges = [0, 180]

    # saturation varies from 0 (black-gray-white) to 255 (pure spectrum color)
    s_ranges = [0, 255]

    ranges = [h_ranges, s_ranges]

    #Create histogram
    hist = cv.CreateHist([h_bins, s_bins], cv.CV_HIST_ARRAY, ranges, 1)

    #Calc histogram
    cv.CalcHist([cv.GetImage(i) for i in planes], hist)

    cv.NormalizeHist(hist, 1.0)

    #Return histogram
    return hist

### EARTH MOVERS ############################################################
def calcEM(hist1,hist2,h_bins,s_bins):

    #Define number of rows
    numRows = h_bins*s_bins

    sig1 = cv.CreateMat(numRows, 3, cv.CV_32FC1)
    sig2 = cv.CreateMat(numRows, 3, cv.CV_32FC1)

    for h in range(h_bins):
        for s in range(s_bins): 
            bin_val = cv.QueryHistValue_2D(hist1, h, s)
            cv.Set2D(sig1, h*s_bins+s, 0, cv.Scalar(bin_val))
            cv.Set2D(sig1, h*s_bins+s, 1, cv.Scalar(h))
            cv.Set2D(sig1, h*s_bins+s, 2, cv.Scalar(s))

            bin_val = cv.QueryHistValue_2D(hist2, h, s)
            cv.Set2D(sig2, h*s_bins+s, 0, cv.Scalar(bin_val))
            cv.Set2D(sig2, h*s_bins+s, 1, cv.Scalar(h))
            cv.Set2D(sig2, h*s_bins+s, 2, cv.Scalar(s))

    #This is the important line were the OpenCV EM algorithm is called
    return cv.CalcEMD2(sig1,sig2,cv.CV_DIST_L2)

### MAIN ########################################################################
if __name__=="__main__":
    #Load image 1
    src1 = cv.LoadImage("image1.jpg")

    #Load image 1
    src2 = cv.LoadImage("image2.jpg")

    # Get histograms
    histSrc1= calcHistogram(src1)
    histSrc2= calcHistogram(src2)

    # Compare histograms using earth mover's
    histComp = calcEM(histSrc1,histSrc2,30,32)

    #Print solution
    print(histComp)

我使用Python 2.7和Python(x,y)测试了与之前的代码非常相似的代码。如果您想了解有关Earth
Mover的更多信息,并希望了解使用OpenCV和C ++的实现,则可以阅读Gary Bradski和Adrain
Kaebler的“学习OpenCV”一书的“第7章:直方图匹配”。



 类似资料:
  • 我试图使用Dozer映射UUID字段,遇到了Dozer github上提到的一个问题: https://github.com/DozerMapper/dozer/issues/83 问题是-显然,Dozer依赖于UUID中不存在的默认无参数构造函数。因此,该链接显示了如何告知推土机执行参考复制。然而,使用该提示并没有帮助,我仍然会遇到以下异常: org.dozer.java.lang.java.u

  • 我有四门课: 从我在dozer留档中读到的关于继承的内容来看,它必须非常简单,我需要将超级类相互映射,以及子类。以下是它在xml中的外观: 所有这些类都是相同的,我的意思是D和D具有相同的属性,C和C等等。 问题:在我传递给dozer的对象中,我有一个类型为B的属性,它可以由C或D(多态性)初始化。当dozer返回新的映射对象时,它总是将属性类型B返回给我,而不是C或D。如何解决这个问题?

  • 我在Spring启动时使用推土机映射器。如果我将数据从实体映射到EntityDTO,那么dozer maper的工作就是将数据从实体类复制到EntityDTO,对于原语也是如此。但是假设我有这样一门课 和名称为EntityDTO的DTO 那么它不会将数据从entityChild映射到EntityChildTos,有人能帮我解决这个问题吗?

  • 我是使用dozer的新手。我需要将集合映射到一个类,该类是集合中源类的属性。我有如下类技术 我想映射到 哪里 我的推土机绘图将是什么样子?

  • 在Dozer中,我们能够在字段映射期间在提示中提到接口。我们如何在MapStruct中实现同样的功能呢? 我不能把确切的代码放在这里。但是,它与下面类似。这里有一个域类示例: 其中,B是一个抽象类。C是一个包含我们必须映射的列表项的类。 DTO侧的类和接口结构也类似。所以,在Dozer中的映射如下所示: 在MapStruct中,我们如何引用Dozer中的提示中给出的接口? 场景:我们有: 在那里,

  • 欧氏距离 也称欧几里得距离,是指在m维空间中两个点之间的真实距离。欧式距离在ML中使用的范围比较广,也比较通用,就比如说利用k-Means对二维平面内的数据点进行聚类,对魔都房价的聚类分析(price/m^2 与平均房价)等。 两个n维向量a($$x_{11},x_{12}.....x_{1n}$$)与 b($$x_{21},x_{22}.....x_{2n}$$)间的欧氏距离 python 实现