Как я могу сделать PIL.ImageOps.solarize с помощью opencv-python? - PullRequest
0 голосов
/ 16 октября 2019

Я попробовал этот код, но обнаружил, что цвета не совпадают

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?

1 Ответ

0 голосов
/ 16 октября 2019

В вашем коде есть несколько ошибок и упущений;на самом деле это даже не компилируется. Пожалуйста, обратите внимание, чтобы всегда предоставлять правильный минимальный воспроизводимый пример .

Первая проблема заключается в том, что 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 должны быть инвертированы, что не отражено в приведенном выше описании.

Надеюсь, это поможет!

...