Проблема при сохранении png в jpg в opencv

#python #python-3.x #opencv #png

#python #python-3.x #opencv #png

Вопрос:

Я запускаю этот фрагмент кода и получаю неверный результат:

         #saving image into a white bg
        img = cv2.imread(dir_img   id, cv2.IMREAD_UNCHANGED)
        img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
        print(img.shape)
        cv2.imwrite(dir_img   id, img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
  

введите описание изображения здесь

Исходный файл представляет собой png с прозрачным фоном. Я не знаю почему, но он сохраняется с этим серым рисунком за горлышком бутылки.

Исходный файл: введите описание изображения здесь

Комментарии:

1. Можете ли вы поделиться исходным файлом?

2. возможно, потому, что на вашем изображении есть этот серый узор, но он «скрыт» альфа-каналом

3. @Alderven Загружен исходный файл

4. @Miki как мне это удалить?

Ответ №1:

Как упоминалось в комментариях, простое удаление альфа-канала в этом случае не удаляет фон, потому что канал BGR содержит артефакт, который вы пытаетесь удалить, как показано ниже, когда вы отображаете только канал B, G или R.

Канал B

И ваш альфа-канал выглядит следующим образом

альфа-канал

Чтобы достичь того, что вам нужно, вам нужно применить некоторую матричную математику для получения вашего результата. Я прикрепил код здесь

 import cv2
import matplotlib.pyplot as plt

img_path = r"path/to/image"

#saving image into a white bg
img = cv2.imread(img_path, cv2.IMREAD_UNCHANGED)
plt.imshow(img)
plt.show()
b,g,r, a = cv2.split(img)
print(img.shape)

new_img  = cv2.merge((b, g, r))
not_a = cv2.bitwise_not(a)
not_a = cv2.cvtColor(not_a, cv2.COLOR_GRAY2BGR)
plt.imshow(not_a)
plt.show()
new_img = cv2.bitwise_and(new_img,new_img,mask = a)
new_img = cv2.add(new_img, not_a)

cv2.imwrite(output_dir, new_img)
plt.imshow(new_img)
print(new_img.shape)
plt.show()
  

Результатом является изображение с размерами (1200, 1200, 3)

введите описание изображения здесь