2017-04-23 22 views
3

私はPythonで適応ヒストグラム等化を実装​​しようとしています。画像を取り込んで小さな領域に分割し、従来のヒストグラムの均等化を適用します。次に、小さな画像を1つに結合し、最終的に得られる画像を得る。最終的な画像は本質的に非常にぼやけているように見え、個々の領域ごとに異なるコントラストレベルを有する。より小さな画像の代わりに単一の画像のように見えるように、個々の画像ごとに一様なコントラストを維持できる方法はありますか?Pythonの適応ヒストグラム均等化

Input Output

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') 
+0

このアルゴリズムのアプローチは本当に必要ですか?あなたが見ている結果は期待されるものです。もちろん、滑らかさはあまりありません。私は適応型のhist-eqに慣れていないので、私はウィキペディアを探して、アルゴリズムは非常に異なっています(スライドウィンドウベース、あなたの場合のような重なり合っていないブロックはありません)。また、[skimageのアプローチ/実装](http://scikit-image.org/docs/stable/api/skimage.exposure.html#skimage.exposure.equalize_adapthist)もご覧ください。 – sascha

+0

出力は、問題へのあなたのアプローチに基づいて予想されるものです...それぞれのヒストグラムが異なるため、各ブロックを別々に扱います。その問題に関する論文やオープンソースコードを読んだことがありますか?ホイールを再発明する理由はありません。 – Piglet

+0

@sascha AHEを達成するために別のコードを投稿しました。それを見直し、それをさらに改善するための変更を提案することは可能でしょうか。 – user2808264

答えて

0

私は、実際のアルゴリズムを検討し、次の実装を思い付きました。私はこれを行うより良い方法があると確信しています。どんな提案も感謝しています。

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) 
関連する問題