2016-08-26 23 views
1

VIPS(およびPython)の16ビットTIFFファイルのさまざまな階調範囲にさまざまな変換を適用する必要があります。私はそうすることができましたが、私はVIPSの初心者です。私はこれを効率的にやっているとは確信していません。これらの画像はそれぞれ数百メガバイトで、余分なステップを1枚にすると、1画像あたり数秒間節約できます。VIPS/Pythonで特定の階調範囲に変換を適用する方法

ルックアップテーブルを使って、以下のコードから取得したのと同じ結果を得るより効率的な方法があるのだろうかと思います(VIPSでどのように動作するのか分かりません)。コードは赤いチャンネルの影を分離し、それらを変換を通して渡します。

im = Vips.Image.new_from_file("test.tiff") 

# Separate the red channel 
band = im[0] 

# Find the tone limit for the bottom 5% 
lim = band.percent(5) 

# Create a mask using the tone limit 
mask = (band <= lim) 

# Convert the mask to 16 bits 
mask = mask.cast(band.BandFmt, shift = True) 

# Run the transformation on the image and keep only the shadow areas 
new_shadows = (65535 * (shadows/lim * 0.1)) & mask 

各色調範囲(ハイライト、シャドウ、中間調のために多かれ少なかれ同様のコードを実行した後、私は元のバンドを再構築するために一緒にすべての結果の画像を追加します。

new_band = (new_shadows.add(new_highlights).add(new_midtones)).cast(band.BandFmt) 
+0

はい、あなたはかなり迅速にそれを作ることができるはずです。

あなたはそれ以上の質問がある場合libvipsトラッカー上の問題を開いてください。たとえば、バンドごとに1回、「パーセント」を3回実行していますか?代わりに、最初に画像のヒストグラムを見つけて分析し、各バンドのパーセントを取得します。私たちが実行しようとする小さな完全な例を投稿してください。編集:あなたが言っているように、もちろんLUTを使うこともできます。これは別の大きなスピードアップをもたらすはずです。 – user894763

答えて

2

私はあなたにデモを作りました

#!/usr/bin/python 

import sys 

import gi 
gi.require_version('Vips', '8.0') 
from gi.repository import Vips 

im = Vips.Image.new_from_file(sys.argv[1]) 

# find the image histogram 
# 
# we'll get a uint image, one pixel high and 256 or 
# 65536 pixels across, it'll have three bands for an RGB image source 
hist = im.hist_find() 

# find the normalised cumulative histogram 
# 
# for a 16-bit source, we'll have 65535 as the right-most element in each band 
norm = hist.hist_cum().hist_norm() 

# search from the left for the first pixel > 5%: the position of this pixel 
# will give us the pixel value that 5% of pixels fall below 
# 
# .profile() gives back a pair of [column-profile, row-profile], we want index 1 
# one. .getpoint() reads out a pixel as a Python array, so for an RGB Image 
# we'll have something like [19.0, 16.0, 15.0] in shadows 
shadows = (norm > 5.0/100.0 * norm.width).profile()[1].getpoint(0, 0) 

# Now make an identity LUT that matches our original image 
lut = Vips.Image.identity(bands = im.bands, 
          ushort = im.format == Vips.BandFormat.USHORT) 

# do something to the shadows ... here we just brighten them a lot 
lut = (lut < shadows).ifthenelse(lut * 100, lut) 

# make sure our lut is back in the original format, then map the image through 
# it 
im = im.maplut(lut.cast(im.format)) 

im.write_to_file(sys.argv[2]) 

それは、元画像上の単一のfind-ヒストグラム操作を行い、その後、単一のマップヒストグラム:VIPのヒストグラム機能を備えたこのような何かを行う方法を示すプログラム操作は速いはずです。

これは影を調整するだけですが、中間色とハイライトもわずかに拡張する必要がありますが、単一の初期ヒストグラムから3つの変更をすべて行うことができるため、遅くする必要はありません。

https://github.com/jcupitt/libvips/issues

関連する問題