Python中的自适应直方图均衡

use*_*264 5 python numpy image-processing histogram

我试图在python中实现自适应直方图均衡.我拍摄一张图像并将其分割成较小的区域,然后将传统的直方图均衡应用于它.然后我将较小的图像合并为一个并获得最终的合成图像.最终图像在性质上看起来非常块状,并且对于每个单独的区域具有不同的对比度水平.有没有办法可以保持每个单独图像的均匀对比度,使其看起来像单个图像而不是缝合在一起的较小图像.

输入 产量

import cv2
import numpy as np
from matplotlib import pyplot as plt
from scipy.misc import imsave
from scipy import ndimage
from scipy import misc
import scipy.misc
import scipy

import image_slicer
from image_slicer import join
from PIL import Image

img = 'watch.png'
num_tiles = 25
tiles = image_slicer.slice(img, num_tiles)


for tile in tiles:
    img = scipy.misc.imread(tile.filename)
    hist,bins = np.histogram(img.flatten(),256,[0,256])
    cdf = hist.cumsum()
    cdf_normalized = cdf *hist.max()/ cdf.max()  
    plt.plot(cdf_normalized, color = 'g')
    plt.hist(img.flatten(),256,[0,256], color = 'g')
    plt.xlim([0,256])
    plt.legend(('cdf','histogram'), loc = 'upper left')
    cdf_m = np.ma.masked_equal(cdf,0)
    cdf_o = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
    cdf = np.ma.filled(cdf_o,0).astype('uint8')
    img3 = cdf[img]
    cv2.imwrite(tile.filename,img3)
    tile.image = Image.open(tile.filename

image = join(tiles)
image.save('watch-join.png')
Run Code Online (Sandbox Code Playgroud)

use*_*264 2

我回顾了实际的算法并提出了以下实现。我确信有更好的方法来做到这一点。任何建议表示赞赏。

import numpy as np
import cv2

img = cv2.imread('watch.png',0)
print img
img_size=img.shape
print img_size

img_mod = np.zeros((600, 800))

for i in range(0,img_size[0]-30):
    for j in range(0,img_size[1]-30):
        kernel = img[i:i+30,j:j+30]
        for k in range(0,30):
            for l in range(0,30):
                element = kernel[k,l]
                rank = 0
                for m in range(0,30):
                    for n in range(0,30):
                        if(kernel[k,l]>kernel[m,n]):
                            rank = rank + 1
                img_mod[i,j] = ((rank * 255 )/900)

im = np.array(img_mod, dtype = np.uint8)
cv2.imwrite('target.png',im)
Run Code Online (Sandbox Code Playgroud)