hist_equal
ヒストグラムの均等化が必要です。
主なドキュメントは次のとおりです。
https://libvips.github.io/libvips/API/current/libvips-histogram.html
ただし、大きなスライド画像の場合は非常に遅くなります。スライド全体を 1 回スキャンしてヒストグラムを作成し、もう一度スキャンして均等化する必要があります。低解像度レイヤーのヒストグラムを見つけて、それを使用して高解像度レイヤーを均等化する方がはるかに高速です。
例えば:
#!/usr/bin/env python3
import sys
import pyvips
# open the slide image and get the number of layers ... we are not fetching
# pixels, so this is quick
x = pyvips.Image.new_from_file(sys.argv[1])
levels = int(x.get("openslide.level-count"))
# find the histogram of the highest level ... again, this should be quick
x = pyvips.Image.new_from_file(sys.argv[1],
level=levels - 1)
hist = x.hist_find()
# from that, compute the transform for histogram equalisation
equalise = hist.hist_cum().hist_norm()
# and use that on the full-res image
x = pyvips.Image.new_from_file(sys.argv[1])
x = x.maplut(equalise)
x.write_to_file(sys.argv[2])
もう 1 つの要因は、ヒストグラムの均等化が非線形であるため、明度の関係が歪むことです。また、色の関係を歪めたり、ノイズや圧縮アーティファクトがおかしくなったりすることもあります。ここにある画像でそのプログラムを試しました:
$ ~/try/equal.py bild.ndpi[level=7] y.jpg
ストライプはスライド スキャナーによるもので、醜いフリンジは圧縮によるものです。
代わりに、低解像度レベルから画像の最大値と最小値を見つけて、それらを使用してピクセル値の単純な線形ストレッチを行うと思います。
何かのようなもの:
x = pyvips.Image.new_from_file(sys.argv[1])
levels = int(x.get("openslide.level-count"))
x = pyvips.Image.new_from_file(sys.argv[1],
level=levels - 1)
mn = x.min()
mx = x.max()
x = pyvips.Image.new_from_file(sys.argv[1])
x = (x - mn) * (256 / (mx - mn))
x.write_to_file(sys.argv[2])
Region
pyvipsの新機能を見つけましたか? これにより、トレーニング用のパッチの生成が非常に高速になり、場合によっては最大 100 倍高速になります。
https://github.com/libvips/pyvips/issues/100#issuecomment-493960943