【问题标题】:How could I do PIL.ImageOps.solarize with opencv-python?我怎么能用 opencv-python 做 PIL.ImageOps.solarize?
【发布时间】:2019-10-16 10:32:42
【问题描述】:

我试过这段代码,但发现颜色不一样

from PIL import ImageOps
from PIL import Image
im = Image.open(imgpth)
impil = np.array(im)
imcv = cv2.imread(imgpth)[:, :, ::-1].copy()
print(np.sum(imcv - impil))

impil_sol = np.array(ImageOps.solarize(im, threshold=128))
idx = imcv > 128
imcv_sol[idx] = 255 - imcv_sol[idx]
print(np.sum(impil_sol - imcv_sol))

第一个输出是 0,但第二个不是 0。PIL.ImageOps.solarize 究竟做了什么,我怎么能用 opencv-python 做呢?

【问题讨论】:

    标签: python opencv python-imaging-library


    【解决方案1】:

    您给定的代码中有一些错误和遗漏;实际上它甚至没有编译。请注意始终提供正确的minimal, reproducible example

    第一个问题是,imcv_sol 没有正确初始化。第二个问题是,PIL.ImageOps.solarize 的描述似乎是错误的(由我突出显示):

    反转所有高于阈值的像素值。

    让我们看看下面的修改后的代码:

    import cv2              # Please provide all necessary imports
    import numpy as np      # Please provide all necessary imports
    from PIL import ImageOps
    from PIL import Image
    
    im = Image.open('path/to/your/image.png')
    impil = np.array(im)
    imcv = cv2.imread('path/to/your/image.png')[:, :, ::-1]
    print(np.sum(imcv - impil))
    
    impil_sol = np.array(ImageOps.solarize(im, threshold=128))
    imcv_sol = imcv.copy()  # imcv_sol was nowhere initialized?
    idx = imcv >= 128       # threshold seems to be also incorporated, i.e. >= instead of > here
    imcv_sol[idx] = 255 - imcv[idx]
    print(np.sum(impil_sol - imcv_sol))
    

    如果我为任何图像运行该代码,我会得到正确的输出:

    0
    0
    

    如果我切换到idx = imcv > 128,会有偏差。

    您可以检查我的假设,如果您查看具有给定阈值的所有像素,例如,获取ids = impil == 128,然后检查impil_sol[ids]。所有值都是127,因此(也)所有值为128 的像素都必须被反转,这在上面的描述中没有反映出来。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2021-08-31
      • 2023-01-08
      • 2014-03-13
      相关资源
      最近更新 更多