8

は、私は同じサイズの正方形の衛星画像のシーケンスをダウンロードするには、GoogleマップAPIを使用してPDFを生成するスクリプトを持っています。画像はあらかじめ回転させておく必要があります。すでにPILを使用しています。ノーマライズヒストグラムPythonのイメージライブラリ(PIL)を使用して画像のセットの(明るさとコントラスト)

光と地形の条件が異なるため、画像が明るすぎる、暗すぎる、暗い、結果のPDFが醜いものになり、 (バックカントリーのマウンテンバイクで、私は特定の交差点の印刷されたサムネイルを持っていたい)。

(EDIT)目的は、すべての画像を同様の見た目の明るさとコントラストで終了させることです。したがって、明るすぎる画像は暗くしなければならず、暗い画像は明るくする必要があります。 (ちなみに、私は一度ImageMagickのautocontrast使用、またはそのようなauto-gamma、またはequalize、またはautolevel、または何かを、医用画像における興味深い結果ではなく、PILにこれらのいずれかの操作を実行する方法がわかりません)。

私はすでに(時間前にグレースケールのプリンタを持っていた)グレースケールに変換した後、いくつかの画像補正を使用したが、結果はどちらか、良くありませんでした。ここに私のグレースケールコードがあります:

#!/usr/bin/python 

def myEqualize(im) 
    im=im.convert('L') 
    contr = ImageEnhance.Contrast(im) 
    im = contr.enhance(0.3) 
    bright = ImageEnhance.Brightness(im) 
    im = bright.enhance(2) 
    #im.show() 
    return im 

このコードは画像ごとに独立して動作します。すべての画像を最初に分析してから、その視覚特性(コントラスト、輝度、ガンマなど)を「正規化」する方が良いかどうか疑問です。

また、各画像に応じてカスタム補正を適用するように画像(ヒストグラム?)を分析する必要があると思います。 "関数は暗黙のうちに初期のコンテクストを考慮する)。

は誰もが、このような問題を抱えていた、および/または着色画像(なしグレースケール)でこれを行うには良い選択肢を知っていますか?

お読みいただきありがとうございます。

+0

良い質問!しかしながら、いくつかの明確化が必要である。また、サンプル画像を投稿することは、人々がテストケースとして使用するのに非常に役立ちます。まず、タイルのエッジがダウンロード時にうまく一致しないという問題がありますか?または、あなたは暗いタイルを明るくし、明るいものを暗くする方法をお探しですか?またはエッジの連続性を維持しながら後者を行う必要がありますか? – Paul

+0

画像のセットが連続していないため、エッジは問題にはなりません。あなたが言ったように、暗いものを暗くし、暗いものを明るくすることが目標です。 – heltonbiker

答えて

4

あなたが探しているのは、ヒストグラムのストレッチを実行するユーティリティです。 Here is one implementation。私は他の人がいると確信しています。元の色相を保ち、この機能をすべてのカラーバンドにわたって均一に適用したいと思います。もちろん

タイルのいくつかは、彼らが参加するレベルで顕著な不連続性を持っていることを良いチャンスがあります。しかし、これを回避するには、「ストレッチ」パラメータの空間補間が必要で、これははるかに複雑な解決策です。 (。...しかし、その必要性がある場合は良い練習になります)

編集:ここでは

は、画像色相を維持する微調整です:

import operator 

def equalize(im): 
    h = im.convert("L").histogram() 
    lut = [] 
    for b in range(0, len(h), 256): 
     # step size 
     step = reduce(operator.add, h[b:b+256])/255 
     # create equalization lookup table 
     n = 0 
     for i in range(256): 
      lut.append(n/step) 
      n = n + h[i+b] 
    # map image through lookup table 
    return im.point(lut*im.layers) 
+0

うわー、まさに私が欲しかったものです。私はすぐに試してみて、すぐにフィードバックをポストします! – heltonbiker

+0

実際、この実装は一度に1つのイメージで動作するように見えますが、最初にすべてのイメージを分析してからイコライゼーションを適用することを考えていました。また、画像はタイル張られず、異なる場所にあり、通常は重ならない。私はあなたの提案をテストし、私が得るものを見ます。ありがとう! – heltonbiker

+0

私は、カメラからの通常のデジタル画像でそれを試してみました。しかし、Google衛星画像のスクリーンキャプチャで試してみると、ひどいものでした。私は、座っているイメージは非常にポスターなどのものだと思う。 – Paul

1

次のコードは、上の作品顕微鏡からの画像(類似している)をステッチングする前に準備する。妥当な結果を得て、20枚のテストセットで使用しました。

輝度平均関数は、Stackoverflow questionです。

from PIL import Image 
from PIL import ImageStat 
import math 

# function to return average brightness of an image 
# Source: https://stackoverflow.com/questions/3490727/what-are-some-methods-to-analyze-image-brightness-using-python 

def brightness(im_file): 
    im = Image.open(im_file) 
    stat = ImageStat.Stat(im) 
    r,g,b = stat.mean 
    return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2)) #this is a way of averaging the r g b values to derive "human-visible" brightness 

myList = [0.0] 
deltaList = [0.0] 
b = 0.0 
num_images = 20       # number of images 

# loop to auto-generate image names and run prior function 
for i in range(1, num_images + 1):  # for loop runs from image number 1 thru 20 
    a = str(i) 
    if len(a) == 1: a = '0' + str(i) # to follow the naming convention of files - 01.jpg, 02.jpg... 11.jpg etc. 
    image_name = 'twenty/' + a + '.jpg' 
    myList.append(brightness(image_name)) 

avg_brightness = sum(myList[1:])/num_images 
print myList 
print avg_brightness 

for i in range(1, num_images + 1): 
    deltaList.append(i) 
    deltaList[i] = avg_brightness - myList[i] 

print deltaList 

この時点では、「補正」値(値と平均の差)がdeltaListに格納されます。次のセクションでは、この補正をすべての画像に1つずつ適用します。

for k in range(1, num_images + 1):  # for loop runs from image number 1 thru 20 
    a = str(k) 
    if len(a) == 1: a = '0' + str(k)  # to follow the naming convention of files - 01.jpg, 02.jpg... 11.jpg etc. 
    image_name = 'twenty/' + a + '.jpg' 
    img_file = Image.open(image_name) 
    img_file = img_file.convert('RGB')  # converts image to RGB format 
    pixels = img_file.load()    # creates the pixel map 
    for i in range (img_file.size[0]): 
     for j in range (img_file.size[1]): 
     r, g, b = img_file.getpixel((i,j)) # extracts r g b values for the i x j th pixel 
     pixels[i,j] = (r+int(deltaList[k]), g+int(deltaList[k]), b+int(deltaList[k])) # re-creates the image 
    j = str(k) 
    new_image_name = 'twenty/' +'image' + j + '.jpg'  # creates a new filename 
    img_file.save(new_image_name)       # saves output to new file name 
関連する問題