Python 3.x 如何使用VIP进行图像标准化?

Python 3.x 如何使用VIP进行图像标准化?,python-3.x,image,image-processing,vips,Python 3.x,Image,Image Processing,Vips,我想规范化一组图像的曝光和调色板。就上下文而言,这是为了在医学图像的图像分类中训练神经网络。我也在为数十万张图片做这项工作,所以效率非常重要 到目前为止,我一直在使用VIP,特别是PyVIP,并且更喜欢使用该库的解决方案。在找到并仔细查看之后,我试着 x = pyvips.Image.new_from_file('test.ndpi') x = x.hist_norm() x.write_to_file('test_normalized.tiff') 但这似乎总是产生一个纯白色的图像 直方图均

我想规范化一组图像的曝光和调色板。就上下文而言,这是为了在医学图像的图像分类中训练神经网络。我也在为数十万张图片做这项工作,所以效率非常重要

到目前为止,我一直在使用VIP,特别是PyVIP,并且更喜欢使用该库的解决方案。在找到并仔细查看之后,我试着

x = pyvips.Image.new_from_file('test.ndpi')
x = x.hist_norm()
x.write_to_file('test_normalized.tiff')

但这似乎总是产生一个纯白色的图像

直方图均衡需要
hist_equal

主要文件如下:

但是,对于大型幻灯片图像,这将非常缓慢。它将需要扫描整个幻灯片一次以建立直方图,然后再次扫描以使其均衡。找到低分辨率层的柱状图,然后用它来均衡高分辨率层,速度会快得多

例如:

#!/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])
另一个因素是直方图均衡是非线性的,所以它会扭曲亮度关系。它还可以扭曲颜色关系,使噪声和压缩伪影看起来疯狂。我在这里的一张图片上尝试了该程序:

$ ~/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])
您在pyvips中找到新的
区域
功能了吗?它使生成训练补丁的速度大大加快,在某些情况下可提高100倍:


谢谢!区域功能看起来很棒。对于hist_equal,我也得到了人工制品。你能说更多关于如何得到最大值和最小值并进行线性拉伸吗?还有,如何将区域写入文件?我添加了一个mx/mn示例。如果要通过文件访问,那么使用fetch是没有意义的——无论你做什么,它都会非常慢。如果你想将像素数组直接输入pytorch等,Fetch很方便——你会看到一个巨大的加速。哦,我想你是说调试?您可以使用
new\u from\u memory
将图像环绕在字节值数组中。