У меня есть следующие логотипы:
И я хочу сделать их серыми с помощью этой функции:
def to_grayscale(path):
return Image.fromarray(cv2.imread(path, cv2.IMREAD_GRAYSCALE))
path
— это просто путь к одному из этих логотипов. В итоге происходит то, что некоторые логотипы вообще не отображаются. Например, логотип Logitect. Его совершенно не видно, несмотря на то, что он черный как смоль.
Можно ли как-нибудь превратить эти логотипы в сплошной серый цвет?
@ fmw42 Я хочу сделать его однородно-серым, сохранив при этом прозрачность..
Какую часть вы хотите сделать однородной серой? Текст логотипа или что там под пленкой?
Что под прозрачностью..
Если вы хотите, чтобы весь текст был серым, но сохраняйте прозрачность, выполните следующие действия в Python/OpenCV.
Вход:
import cv2
import numpy as np
# load image with alpha channel
img = cv2.imread('google.png', cv2.IMREAD_UNCHANGED)
# extract alpha channel
alpha = img[:, :, 3]
# create solid gray image
gray = np.full((img.shape), (128,128,128,0))
# put alpha channel into gray image
result = gray.copy()
result[:,:,3] = alpha
# save output
cv2.imwrite('google_gray_transparent.png', result)
Результат:
Ваш код выдает эту ошибку: ValueError: cannot determine region size; use 4-item box
Этот комментарий не имеет смысла для меня. Где возникает ошибка. Коробка не задействована. Я использую Python 3.7 и OpenCV 3.4.8.
Я починил это. Мне пришлось превратить result
в изображение PIL
Вот один из способов сделать изображение под прозрачностью серым в Python/OpenCV.
Вход:
import cv2
import numpy as np
# load image with alpha channel
img = cv2.imread('google.png', cv2.IMREAD_UNCHANGED)
# extract alpha channel
alpha = img[:, :, 3]
# extract the bgr image
bgr = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
# make gray where alpha is zero
bgr[alpha==0] = (128,128,128)
# put alpha channel into brg image
b,g,r = cv2.split(bgr)
result = img.copy()
result[:,:,0] = b
result[:,:,1] = g
result[:,:,2] = r
result[:,:,3] = alpha
# save output
cv2.imwrite('google_gray_under_transparency1.png', bgr)
cv2.imwrite('google_gray_under_transparency2.png', result)
cv2.imshow('alpha', alpha)
cv2.imshow('bgr', bgr)
cv2.waitKey(0)
БГР:
Результат:
Да, это. На первом изображении показано, что находится под альфа-каналом. Второе изображение имеет первое изображение с исходным альфа-каналом поверх него. Я думал, ты хочешь сохранить альфа-канал. Если нет, то просто остановитесь на первом изображении. Если я неправильно понимаю, что вы хотите, пожалуйста, объясните подробнее.
Я хочу сохранить прозрачный фон, превратив «Google» в серый цвет
Это было то, что я написал ранее ниже. Смотрите мой первый пост.
Вы хотите, чтобы прозрачные части были однородно-серыми или текст логотипа был однородно-серым? Что именно вы хотите. Можете ли вы показать пример? Ваша функция просто считывает изображение и преобразует его из цветного в оттенки серого. Это не делает его однородным серым. Ваша функция также будет игнорировать прозрачность, и вы увидите любой цвет или текстуру ниже прозрачности.