python地球代码,地球移动器距离的Python代码

I am looking for an Earth Mover's distance(or Fast EMD) implementation in python.

Any clues on where to find it, I have looked enough on the web.

I want to use it in an image retrieval project that I am doing.

Thanks.

EDIT:

I found a very nice solution using the pulp libararies.

This page also has the instruction required to set it up.

解决方案

There is an excellent implementation in OpenCv for Python. The name of the function is CalcEMD2 and a simple code to compare histograms of two images would look like this:

#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)

I tested a code very similar to the previous code with Python 2.7 and Python(x,y). If you want to learn more about Earth Mover's and you want to see an implementation using OpenCV and C++, you can read "Chapter 7: Histograms an Matching" of the book "Learning OpenCV" by Gary Bradski & Adrain Kaebler.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值