Python 局部直方图均衡化
我正在尝试使用python做一些图像分析(我必须使用python)。我需要做全局和局部直方图均衡化。全局版本运行良好,但是本地版本使用7x7封装,结果非常差 这是全局版本:Python 局部直方图均衡化,python,image,numpy,filter,histogram,Python,Image,Numpy,Filter,Histogram,我正在尝试使用python做一些图像分析(我必须使用python)。我需要做全局和局部直方图均衡化。全局版本运行良好,但是本地版本使用7x7封装,结果非常差 这是全局版本: import matplotlib.pyplot as plt import matplotlib.image as mpimg from scipy import ndimage,misc import scipy.io as io from scipy.misc import toimag
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from scipy import ndimage,misc
import scipy.io as io
from scipy.misc import toimage
import numpy as n
import pylab as py
from numpy import *
mat = io.loadmat('image.mat')
image=mat['imageD']
def histeq(im,nbr_bins=256):
#get image histogram
imhist,bins = histogram(im.flatten(),nbr_bins,normed=True)
cdf = imhist.cumsum() #cumulative distribution function
cdf = 0.6 * cdf / cdf[-1] #normalize
#use linear interpolation of cdf to find new pixel values
im2 = interp(im.flatten(),bins[:-1],cdf)
#returns image and cumulative histogram used to map
return im2.reshape(im.shape), cdf
im=image
im2,cdf = histeq(im)
为了实现本地版本,我尝试使用这样的通用过滤器(使用与先前加载的相同图像):
是否有人对第二个版本不起作用有任何建议/想法?我真的被卡住了,任何评论都将不胜感激!提前谢谢 您可以使用该库执行全局和局部直方图均衡化。从链接中骄傲地窃取,下面是片段。均衡是用一个磁盘形状的内核(或封装外形)完成的,但是您可以通过设置kernel=np.ones((N,M))
将其更改为正方形
我想知道这是否与7x7=49,而您使用的是256个垃圾箱这一事实有关。我想了想。。。我尝试使用49,但没有很大的改进。但是我认为它应该是256,因为cdf应该是每个亮度值有多少像素的累积和,所以按像素值而不是像素数进行装箱是有意义的(我认为?!)。谢谢你的意见@user3011255:如果您使用like
7
bin怎么办?
def func(x):
cdf=[]
xhist,bins=histogram(x,256,normed=True)
cdf = xhist.cumsum()
cdf = 0.6 * cdf / cdf[-1]
im_out = interp(x,bins[:-1],cdf)
midval=interp(x[24],bins[:-1],cdf)
return midval
print im.shape
im3=ndimage.filters.generic_filter(im, func,size=im.shape,footprint=n.ones((7,7)))
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from skimage import data
from skimage.util import img_as_ubyte
from skimage import exposure
import skimage.morphology as morp
from skimage.filters import rank
# Original image
img = img_as_ubyte(data.moon())
# Global equalize
img_global = exposure.equalize_hist(img)
# Local Equalization, disk shape kernel
# Better contrast with disk kernel but could be different
kernel = morp.disk(30)
img_local = rank.equalize(img, selem=kernel)
fig, (ax_img, ax_global, ax_local) = plt.subplots(1, 3)
ax_img.imshow(img, cmap=plt.cm.gray)
ax_img.set_title('Low contrast image')
ax_img.set_axis_off()
ax_global.imshow(img_global, cmap=plt.cm.gray)
ax_global.set_title('Global equalization')
ax_global.set_axis_off()
ax_local.imshow(img_local, cmap=plt.cm.gray)
ax_local.set_title('Local equalization')
ax_local.set_axis_off()
plt.show()