Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 局部直方图均衡化_Python_Image_Numpy_Filter_Histogram - Fatal编程技术网

Python 局部直方图均衡化

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

我正在尝试使用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 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()