python 基于numpy和PIL的图像局部熵计算方法

来源:互联网 发布:adobe 3d软件 编辑:程序博客网 时间:2024/05/16 08:06

参考matlab中图像局部熵的计算方法,改写为python。为检验将影像局部熵转化为灰度后的正确性,采用鼠标取点检验的方法。并将熵以灰度图像输出保存。

#-*- coding:utf-8 -*-from numpy import *from pylab import *from PIL import ImageI=Image.open('123.jpg').convert('L')I1=I.resize((100,100))  #实验采样Im=array(I1)m,n=Im.shapeIm2=zeros(Im.shape)k=3for i in range(k,m-k):    for j in range(k,n-k):        his = zeros(256)        for p in range(i-k,i+k+1):            for q in range(j-k,j+k+1):                his[Im[p,q]]=his[Im[p,q]]+1        his1=his/float(sum(his))        for g in range(0,256):            if his1[g]!=0:                Im2[i,j]=Im2[i,j]-his1[g]*log(his1[g])Im3=zeros(Im.shape) #Im3为将熵进行归一化处理Im4=zeros(Im.shape) #Im4为熵转换成灰度图像Im5=zeros(Im.shape) #Im5为二值图像,阈值为200maxa=amax(Im2)mina=amin(Im2)for i in range(0,m):    for j in range(0,n):        if (maxa-mina)!=0:            Im3[i,j]=(Im2[i,j]-mina)/(maxa-mina)        else:            Im3[i,j]=1        Im4[i,j]=uint(Im3[i,j]*255)        if Im4[i,j]>=200:            Im5[i,j]=1        else:            Im5[i,j]=0t=imshow(Im4)plt.colorbar(t)print 'Please click a point' #鼠标取值x=ginput(3)for w in range(0,3):    print w,'times,you clicked:',x[w][0],x[w][1],Im4[x[w][0],x[w][1]]show()Im6=Image.fromarray(uint8(Im4))Im6.save('123_ent.jpg')
实验结果如下图所示:上图为原始图像,下图为局部熵。


1 0