14

Google Maps APIを使用して、同じサイズの正方形の衛星画像のシーケンスをダウンロードし、PDFを生成するスクリプトがあります。画像は事前に回転させる必要がありますが、私はすでにPILを使用しています。

光と地形の条件が異なるため、一部の画像が明るすぎたり、暗すぎたり、結果のpdfが少し醜くなり、「フィールド」(バックカントリー)での読書条件が理想的ではないことに気付きました。特定の交差点のサムネイルを印刷したいマウンテンバイク)。

(編集)その場合の目標は、すべての画像が同じような見かけの明るさとコントラストになるようにすることです。したがって、明るすぎる画像は暗くする必要があり、暗い画像は明るくする必要があります。(ちなみに、私はかつてimagemagick autocontrast、または、、、、auto-gammaまたはそのようなものを使用し、医用画像で興味深い結果が得られましたが、PILでこれらのいずれかを行う方法がわかりません)。equalizeautolevel

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

#!/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

このコードは、画像ごとに独立して機能します。最初にすべての画像を分析してから、それらの視覚的特性(コントラスト、明るさ、ガンマなど)を「正規化」する方がよいのではないかと思います。

また、すべての画像を均等に補正するのではなく、画像ごとにカスタム補正を適用するために、画像(ヒストグラム?)で何らかの分析を行う必要があると思います(ただし、「拡張」関数は暗黙的に考慮します)初期の条件)。

誰かがそのような問題を抱えていたり、カラー画像(グレースケールなし)でこれを行うための良い代替案を知っていますか?

読んでくれてありがとう!

4

2 に答える 2

9

おそらく探しているのは、「ヒストグラムのストレッチ」を実行するユーティリティです。 これが1つの実装です。他にもあると思います。元の色合いを維持し、この機能をすべてのカラーバンドに均一に適用したいと思います。

もちろん、一部のタイルは、それらが結合するレベルで顕著な不連続性を持つ可能性があります。ただし、これを回避するには、「ストレッチ」パラメータの空間補間が必要になり、はるかに複雑なソリューションになります。(...しかし、その必要性がある場合は良い運動になるでしょう。)

編集:

画像の色相を維持するための調整は次のとおりです。

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)
于 2011-08-24T03:11:06.780 に答える
3

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

明るさの平均関数は、別のStackoverflowの質問からのものです。

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
于 2016-07-01T05:59:36.453 に答える