python - 在 python/PIL 中执行与 ImageMagick 的 "-level"相同的操作?

标签 python image image-processing imagemagick python-imaging-library

我想在 python 中调整图像的颜色级别。我可以使用任何可以轻松安装在我的 Ubuntu 桌面上的 python 库。我想做与 ImageMagick 的 -level ( http://www.imagemagick.org/www/command-line-options.html#level ) 相同的事情。 PIL(Python Image Library)似乎没有。我一直在图像上调用 convert 然后再读回文件,但这似乎很浪费。有没有更好/更快的方法?

最佳答案

如果我正确理解了 ImageMagick 的 -level 选项,那么我提供的 level_image 函数应该可以满足您的需求。

需要注意两点:

  • 速度肯定可以提高
  • 它目前只适用于 RGB 图像
  • 该算法通过 HSV 颜色空间,仅影响 V(亮度)分量

代码:

import colorsys

class Level(object):

    def __init__(self, minv, maxv, gamma):
        self.minv= minv/255.0
        self.maxv= maxv/255.0
        self._interval= self.maxv - self.minv
        self._invgamma= 1.0/gamma

    def new_level(self, value):
        if value <= self.minv: return 0.0
        if value >= self.maxv: return 1.0
        return ((value - self.minv)/self._interval)**self._invgamma

    def convert_and_level(self, band_values):
        h, s, v= colorsys.rgb_to_hsv(*(i/255.0 for i in band_values))
        new_v= self.new_level(v)
        return tuple(int(255*i)
                for i
                in colorsys.hsv_to_rgb(h, s, new_v))

def level_image(image, minv=0, maxv=255, gamma=1.0):
    """Level the brightness of image (a PIL.Image instance)
    All values ≤ minv will become 0
    All values ≥ maxv will become 255
    gamma controls the curve for all values between minv and maxv"""

    if image.mode != "RGB":
        raise ValueError("this works with RGB images only")

    new_image= image.copy()

    leveller= Level(minv, maxv, gamma)
    levelled_data= [
        leveller.convert_and_level(data)
        for data in image.getdata()]
    new_image.putdata(levelled_data)
    return new_image

如果有某种方法可以使用 PIL 进行 RGB→HSV 转换(反之亦然),则可以拆分为 H、S、V 波段,使用 .point 方法V波段并转换回RGB,大大加快了处理速度;但是,我还没有找到这样的方法。

关于python - 在 python/PIL 中执行与 ImageMagick 的 "-level"相同的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3105603/

相关文章:

c# - .net 中是否有任何免费的 LPR(车牌识别器)软件?

python - Pandas DataFrame 到列表列表的字典

python - 每日 cron 运行终止,因为它超过了最大运行时间

python - 如何为图像添加高斯噪声?

python - 安装后我找不到 anaconda navigator

php - 刷新图像 PHP 和 Javascript

Android,创建多个位图时createScaledBitmap变慢

c++ - CL_UNSIGNED_INT8 和 CL_RGB 不兼容

image - Phonegap 从画廊/相机中选择多个图像

c++ - opencv背景减法中的过滤线和曲线