3
私はPythonで適応ヒストグラム等化を実装しようとしています。画像を取り込んで小さな領域に分割し、従来のヒストグラムの均等化を適用します。次に、小さな画像を1つに結合し、最終的に得られる画像を得る。最終的な画像は本質的に非常にぼやけているように見え、個々の領域ごとに異なるコントラストレベルを有する。より小さな画像の代わりに単一の画像のように見えるように、個々の画像ごとに一様なコントラストを維持できる方法はありますか?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')
このアルゴリズムのアプローチは本当に必要ですか?あなたが見ている結果は期待されるものです。もちろん、滑らかさはあまりありません。私は適応型のhist-eqに慣れていないので、私はウィキペディアを探して、アルゴリズムは非常に異なっています(スライドウィンドウベース、あなたの場合のような重なり合っていないブロックはありません)。また、[skimageのアプローチ/実装](http://scikit-image.org/docs/stable/api/skimage.exposure.html#skimage.exposure.equalize_adapthist)もご覧ください。 – sascha
出力は、問題へのあなたのアプローチに基づいて予想されるものです...それぞれのヒストグラムが異なるため、各ブロックを別々に扱います。その問題に関する論文やオープンソースコードを読んだことがありますか?ホイールを再発明する理由はありません。 – Piglet
@sascha AHEを達成するために別のコードを投稿しました。それを見直し、それをさらに改善するための変更を提案することは可能でしょうか。 – user2808264