Установите белый фон для png вместо прозрачности с OpenCV - PullRequest
0 голосов
/ 12 декабря 2018

У меня также есть изображение OpenCv;

opencvImage = cv2.cvtColor(numpy_image, cv2.COLOR_RGBA2BGRA)

Затем, используя следующий фрагмент кода, я хочу удалить прозрачность и установить белый фон.

source_img = cv2.cvtColor(opencvImage[:, :, :3], cv2.COLOR_BGRA2GRAY)
source_mask = opencvImage[:,:,3]  * (1 / 255.0)

background_mask = 1.0 - source_mask

bg_part = (background_color * (1 / 255.0)) * (background_mask)
source_part = (source_img * (1 / 255.0)) * (source_mask)

result_image = np.uint8(cv2.addWeighted(bg_part, 255.0, source_part, 255.0, 0.0))

На самом деле, я могу установить белый фон, но фактический цвет изображения тоже меняется.Я считаю, что COLOR_BGRA2GRAY методы вызывают эту проблему.Вот почему я пытался использовать метод IMREAD_UNCHANGED , но у меня есть эта ошибка: неподдерживаемый код преобразования цвета в функции 'cvtColor'

Кстати, я открыт для любогоРешение, я просто делюсь своим кодом - может потребоваться небольшое исправление.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вот базовый скрипт, который заменит все полностью прозрачные пиксели белым и затем удалит альфа-канал.

import cv2
#load image with alpha channel.  use IMREAD_UNCHANGED to ensure loading of alpha channel
image = cv2.imread('your image', cv2.IMREAD_UNCHANGED)    

#make mask of where the transparent bits are
trans_mask = image[:,:,3] == 0

#replace areas of transparency with white and not transparent
image[trans_mask] = [255, 255, 255, 255]

#new image without alpha channel...
new_img = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)
0 голосов
/ 12 декабря 2018

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

 /* Setting data info */
std::string test_image_path = "Galicia.png";

/* General variables */
cv::namedWindow("Input image", cv::WINDOW_NORMAL);
cv::namedWindow("Input image R", cv::WINDOW_NORMAL);
cv::namedWindow("Input image G", cv::WINDOW_NORMAL);
cv::namedWindow("Input image B", cv::WINDOW_NORMAL);
cv::namedWindow("Input image A", cv::WINDOW_NORMAL);
cv::namedWindow("Output image", cv::WINDOW_NORMAL);

/* Process */
cv::Mat test_image = cv::imread(test_image_path, cv::IMREAD_UNCHANGED);
std::cout << "Image type: " << test_image.type() << std::endl;

// Split channels of the png files
std::vector<cv::Mat> pngChannels(4);
cv::split(test_image, pngChannels);

cv::imshow("Input image", test_image);
cv::imshow("Input image R", pngChannels[0]);
cv::imshow("Input image G", pngChannels[1]);
cv::imshow("Input image B", pngChannels[2]);
cv::imshow("Input image A", pngChannels[3]);

// Set to 255(white) the RGB channels where the Alpha channel(mask) is 0(transparency)
pngChannels[0].setTo(cv::Scalar(255), pngChannels[3]==0);
pngChannels[1].setTo(cv::Scalar(255), pngChannels[3]==0);
pngChannels[2].setTo(cv::Scalar(255), pngChannels[3]==0);

// Merge again the channels
cv::Mat test_image_output;
cv::merge(pngChannels, test_image_output);

// Show the merged channels.
cv::imshow("Output image", test_image_output);

// For saving with changes, conversion is needed.
cv::cvtColor(test_image_output, test_image_output, cv::COLOR_RGBA2RGB);
cv::imwrite("Galicia_mod.png", test_image_output);

Я дополняю код этим снимком экрана, который может помочь вам лучше понять мое решение:

enter image description here

С наилучшими пожеланиями, арифметика

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...