。
fromPILimportImageimportos#importhashlibdefgetGray(image_file):tmpls=[]forhinrange(0,[1]):#hforwinrange(0,[0]):#wtmpls.append(image_file.getpixel((w,h)))returntmplsdefgetAvg(ls):#获取平均灰度值returnsum(ls)/len(ls)defgetMH(a,b):#比较100个字符有几个字符相同dist=0;foriinrange(0,len(a)):ifa[i]==b[i]:dist=dist+1returndistdefgetImgHash(fne):image_file=(fne)#打开image_file=image_file.resize((12,12))#重置图片大小我12pxX12pximage_file=image_file.convert("L")#转256灰度图Grayls=getGray(image_file)#灰度集合avg=getAvg(Grayls)#灰度平均值bitls=''#接收获取0或1#除去变宽1px遍历像素forhinrange(1,[1]-1):#hforwinrange(1,[0]-1):#wifimage_file.getpixel((w,h))>=avg:#像素的值比较平均值大于记为1小于记为0bitls=bitls+'1'else:bitls=bitls+'0'returnbitls'''m2=hashlib.md5()m2.update(bitls)printm2.hexdigest(),bitlsreturnm2.hexdigest()'''a=getImgHash("./Test/测试图片.jpg")#图片地址自行替换files=os.listdir("./Test")#图片文件夹地址自行替换forfileinfiles:b=getImgHash("./Test/"+str(file))compare=getMH(a,b)printfile,u'相似度',str(compare)+'%'。
AI爱发猫 www.aifamao.com。
代码首先,读入TuriCreate软件包importturicreateastc我们指定图像所在的文件夹image,让TuriCreate读取所有的图像文件,并且存储到data数据框data=tc.image_analysis.load_images('./image/')我们来看看,data数据框的内容:datadata包含两列信息,第一列是图片的地址,第二列是图片的长宽描述。
下面我们要求TuriCreate给数据框中每一行添加一个行号。这将作为图片的标记,方便后面查找图片时使用,并输出查看data。
data=data.add_row_number()data下面,是重头戏。我们让TuriCreate根据输入的图片集合,建立图像相似度判别模型。
model=tc.image_similarity.create(data)这个语句执行起来,可能需要一些时间。如果你是第一次使用TuriCreate,它可能还需要从网上下载一些数据。请耐心等待。
经过或长或短的等待,模型已经成功建立。下面,我们来尝试给模型一张图片,让TuriCreate帮我们从目前的图片集合里,挑出最为相似的10张来。为了方便,我们就选择第一张图片作为查询输入。
我们利用show()函数展示一下这张图片。tc.Image(data[0]['path']).show()下面我们来查询,我们让模型寻找出与这张图片最相似的10张。
similar_images=model.query(data[0:1],k=10)我们把结果存储在了similar_images变量里面,下面我们来看看其中都有哪些图片。
similar_images返回的结果一共有10行。跟我们的要求一致。每一行数据,包含4列。
分别是:查询图片的标记获得结果的标记结果图片与查询图片的距离结果图片与查询图片近似程度排序值有了这些信息,我们就可以查看到底哪些图片与输入查询图片最为相似了。
注意其中的第一张结果图片,其实就是我们的输入图片本身。考虑它没有意义。我们提取全部结果图片的标记(索引)值,忽略掉第一张(自身)。
similar_image_index=similar_images['reference_label'][1:]把上面9张图片的标记在所有图片的索引列表中过滤出来:filtered_index=data['id'].apply(lambdax:xinsimilar_image_index)filtered_index验证完毕以后,请执行以下语句。
我们再次调用TuriCreate的explore()函数,展现相似度查询结果图片。data[filtered_index].explore()。
就是给出以下几个function的def越多越好:1、red_average(Picture)算出pic众pixels的平均红值。
2、scale_red(Picture,int)调整图片红值并确保其不超过255。3、expand_width(Picture,int) 。
4、reduce_width(Picture,int)放大和缩小宽值都是乘或者除的,distance(Pixel,Pixel)以红蓝绿值为标准计算两个pixel之间的距离(类似于xyz坐标轴中两点距离)。
5、simple_difference(Picture,Picture)简单计算两张图片有多相似不必考虑长宽。
6、smart_difference(Picture,Picture)这个方程的步骤需为:判断图片大小。如必要乘除高度。如必要乘除宽度。调整图片颜色使之相同平均红蓝绿值。
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。
常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。
。
importmediadefred_average(pic):'''Returnanintegerthatrepresentstheaverageredofthepicture.'''total=0forpixelinpic:total=total+media.get_red(pixel)red_average=total/(media.get_width(pic)*media.get_height(pic))returnred_averagedefgreen_average(pic):'''Returnanintegerthatrepresentstheaveragegreenofthepicture'''total=0forpixelinpic:total=total+media.get_green(pixel)green_average=total/(media.get_width(pic)*media.get_height(pic))returngreen_averagedefblue_average(pic):'''Returnanintegerthatrepresentstheaverageblueofthepicture'''total=0forpixelinpic:total=total+media.get_blue(pixel)blue_average=total/(media.get_width(pic)*media.get_height(pic))returnblue_averagedefscale_red(pic,value):'''Returnthepicturethattheaverageoftheredisvaluewhichhasbeenset.'''averaged=red_average(pic)factor=float(value)/averagedforpixelinpic:new_red=min(255,int(factor*media.get_red(pixel)))media.set_red(pixel,new_red)returnpicdefscale_green(pic,value):'''Returnthepicturethattheaverageofthegreenisvaluewhichhasbeenset.'''averaged=green_average(pic)factor=float(value)/averagedforpixelinpic:new_green=min(255,int(factor*media.get_green(pixel)))media.set_green(pixel,new_green)returnpicdefscale_blue(pic,value):'''Returnthepicturethattheaverageoftheblueisvaluewhichhasbeenset.'''averaged=blue_average(pic)factor=float(value)/averagedforpixelinpic:new_blue=min(255,int(factor*media.get_blue(pixel)))media.set_blue(pixel,new_blue)returnpicdefexpand_height(pic,factor):'''Returnanewpicturethathasbeenverticallystretchedbythefactorwhichhasbeenset.'''new_width=pic.get_width()new_height=pic.get_height()*factornewpic=media.create_pic(new_width,new_height,media.black)forpixelinpic:x=media.get_x(pixel)y=media.get_y(pixel)newpixel=media.get_pixel(newpic,x,y*factor)fornewpixelinnewpic:new_red=media.get_red(pixel)new_green=media.get_green(pixel)new_blue=media.get_blue(pixel)media.set_red(newpixel,new_red)media.set_green(newpixel,new_green)media.set_blue(newpixel,new_blue)returnnewpicdefexpand_width(pic,factor):'''Returnanewpicturethathasbeenhorizontallystretchedbythefactorwhichhasbeenset.'''new_width=pic.get_width()*factornew_height=pic.get_height()newpic=media.create_pic(new_width,new_height,media.black)fornewpixelinnewpic:x=media.get_x(newpixel)y=media.get_y(newpixel)pixel=media.get_pixel(pic,x/factor,y)new_red=media.get_red(pixel)new_green=media.get_green(pixel)new_blue=media.get_blue(pixel)media.set_red(newpixel,new_red)media.set_green(newpixel,new_green)media.set_blue(newpixel,new_blue)returnnewpicdefreduce_height(pic,factor):'''returnanewpicthathasbeencompressedverticallybythefactorwhichhasbeenset'''#Createanew,all-blackpicwiththeappropriatenewheightand#oldwidth;(allcolourcomponentsarezero).new_width=pic.get_widthnew_height=(pic.get_height()-1)/factor+1newpic=media.create_pic(new_width,new_height,media.black)#Iteratethroughallthepixelsintheoriginal(large)image,andcopy#aportionofeachpixel'scolourcomponentsintothecorrect#pixelpositioninthesmallerimage.forpixelinpic:#Findthecorrespondingpixelinthenewpic.x=media.get_x(pixel)y=media.get_y(pixel)newpixel=media.get_pixel(newpic,x,y/factor)#Addtheappropriatefractionofthispixel'scolourcomponents#tothecomponentsofthecorrespondingpixelinthenewpic.new_red=new_red()+_red()/factornew_green=new_green()+_green()/factornew_blue=new_blue()+_blue()/fctormedia.set_red(newpixel,new_red)media.set_green(newpixel,new_green)media.set_blue(newpixel,new_blue)returnnewpicdefreduce_width(pic,factor):'''Returnanewpicthathasbeenhorizontallycompressedbythefactorwhichhasbeenset.'''new_width=(media.get_width()-1)/factor+1new_height=media.get_height()newpic=media.create_pic(new_width,new_height,media.black)forpixelinpic:x=media.get_x(pixel)y=media.get_y(pixel)new_pixel=media.get_pixel(newpic,x/factor,y)new_red=new_red()+_red()/factornew_green=new_green()+()/factornew_blue=new_blue()+()/factormedia.set_red(newpixel,new_red)media.set_green(newpixel,new_green)media.set_blue(newpixel,new_blue)returnnewpicdefdistance(pixel1,pixel2):red1=media.get_red(pixel1)green1=media.get_green(pixel1)blue1=media.get_blue(pixel1)red2=media.get_red(pixel2)green2=media.get_green(pixel2)blue2=media.get_blue(pixel2)sum=abs(red1-red2)+abs(green1-green2)+abs(blue1-blu2)returnsumdefsimple_difference(pic1,pic2):forpixelinpic1:x=media.get_x(pixel)y=media.get_y(pixel)pixel2=media.get_pixel(pic2,x,y)sum=media.distance(pixel,pixel2)returnsumdefsmart_difference(pic1,pic2):height1=media.get_height(pic1)height2=media.get_height(pic2)factorh=float(height1/height2)iffactorh>=1:height1=media.reduce_height(pic1,factorh)else:height2=media.reduce_height(pic2,1/factorh)width1=media.get_width(pic1)width2=media.get_width(pic2)factorw=float(width1/width2)iffactorw>=1:width1=reduce_width(pic1,factorw)else:width2=reduce_width(pic2,1/factorw)red1=red_average(pic1)green1=green_average(pic1)blue1=blue_average(pic1)red2=media.scale_red(pic2,red1)green2=media.scale_green(pic2,green1)blue2=media.scale_blue(pic2,blue1)#if__name__=='__main__':(newpic)。