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

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

#-*- coding:utf-8 -*-
from numpy import *
from pylab import *
from PIL import Image
I=Image.open('123.jpg').convert('L')
I1=I.resize((100,100))  #实验采样
Im=array(I1)
m,n=Im.shape
Im2=zeros(Im.shape)
k=3
for 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为二值图像,阈值为200
maxa=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]=0
t=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')
实验结果如下图所示:上图为原始图像,下图为局部熵。



版权声明:本文为nillei原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。