期末專題報告
使用python實作如何計算圖像的相似度。
程式碼:
#!/usr/bin/python
# Filename: histsimilar.py
# -*- coding: utf-8 -*-
from PIL import Image
def make_regalur_image(img, size = (256,
256)):
return
img.resize(size).convert('RGB')
def split_image(img, part_size = (64, 64)):
w,
h = img.size
pw,
ph = part_size
assert
w % pw == h % ph == 0
return
[img.crop((i, j, i+pw, j+ph)).copy() \
for
i in xrange(0, w, pw) \
for
j in xrange(0, h, ph)]
def hist_similar(lh, rh):
assert
len(lh) == len(rh)
return
sum(1 - (0 if l == r else float(abs(l - r))/max(l, r)) for l, r in zip(lh,
rh))/len(lh)
def calc_similar(li, ri):
# return
hist_similar(li.histogram(), ri.histogram())
return
sum(hist_similar(l.histogram(), r.histogram()) for l, r in zip(split_image(li),
split_image(ri))) / 16.0
def calc_similar_by_path(lf, rf):
li,
ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))
return
calc_similar(li, ri)
def make_doc_data(lf, rf):
li,
ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))
li.save(lf
+ '_regalur.png')
ri.save(rf
+ '_regalur.png')
fd
= open('stat.csv', 'w')
fd.write('\n'.join(l
+ ',' + r for l, r in zip(map(str, li.histogram()), map(str, ri.histogram()))))
# print
>>fd, '\n'
# fd.write(','.join(map(str,
ri.histogram())))
fd.close()
import
ImageDraw
li
= li.convert('RGB')
draw
= ImageDraw.Draw(li)
for
i in xrange(0, 256, 64):
draw.line((0,
i, 256, i), fill = '#ff0000')
draw.line((i,
0, i, 256), fill = '#ff0000')
li.save(lf
+ '_lines.png')
if __name__ == '__main__':
path
= r'testpic/TEST%d/%d.JPG'
for
i in xrange(1, 7):
print
'test_case_%d: %.3f%%'%(i, \
calc_similar_by_path('testpic/TEST%d/%d.JPG'%(i,
1), 'testpic/TEST%d/%d.JPG'%(i, 2))*100)
# make_doc_data('test/TEST4/1.JPG',
'test/TEST4/2.JPG')

0 個意見:
張貼留言
訂閱 張貼留言 [Atom]
<< 首頁