2016-03-25 3 views
2

У меня есть этот образ в OpenCV imgColorPanel = imread("newGUI.png", CV_LOAD_IMAGE_COLOR);:Измените все белые пиксели изображения прозрачным в OpenCV C++

enter image description here

Когда я загрузить его в серой шкале imgColorPanel = imread("newGUI.png", CV_LOAD_IMAGE_GRAYSCALE); она выглядит следующим образом:

enter image description here

Однако я хочу удалить белый фон или сделать его прозрачным (только белые пиксели), чтобы выглядеть так:

Как это сделать на C++ OpenCV?

enter image description here

+0

резюме :: cvtColor (ввод, вывод, CV_BGR2BGRA); то для каждого пикселя: если pixel == white, установите значение альфа этого пикселя равным нулю. – Micka

+0

ах нет, ваше входное изображение уже прозрачно? используйте флаг CV_LOAD_IMAGE_ANYDEPTH. – Micka

+0

или используйте любое отрицательное значение, как указано в http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#imread – Micka

ответ

8

Вы можете преобразовать входное изображение в BGRA канала (цветное изображение с альфа-каналом), а затем изменить каждый пиксель, который является белым, чтобы установить значение альфа к нулю.

Смотреть этот код:

// load as color image BGR 
    cv::Mat input = cv::imread("C:/StackOverflow/Input/transparentWhite.png"); 

    cv::Mat input_bgra; 
    cv::cvtColor(input, input_bgra, CV_BGR2BGRA); 

    // find all white pixel and set alpha value to zero: 
    for (int y = 0; y < input_bgra.rows; ++y) 
    for (int x = 0; x < input_bgra.cols; ++x) 
    { 
     cv::Vec4b & pixel = input_bgra.at<cv::Vec4b>(y, x); 
     // if pixel is white 
     if (pixel[0] == 255 && pixel[1] == 255 && pixel[2] == 255) 
     { 
      // set alpha to zero: 
      pixel[3] = 0; 
     } 
    } 

    // save as .png file (which supports alpha channels/transparency) 
    cv::imwrite("C:/StackOverflow/Output/transparentWhite.png", input_bgra); 

Это позволит сохранить изображение с прозрачностью. В результате изображение открывается с GIMP выглядит следующим образом:

enter image description here

Как вы можете видеть, некоторые «белые области» не являются прозрачными, это означает, что ваш тот пиксель не было совершенно белым во входном изображении. Вместо этого, вы можете попробовать

// if pixel is white 
    int thres = 245; // where thres is some value smaller but near to 255. 
    if (pixel[0] >= thres&& pixel[1] >= thres && pixel[2] >= thres) 
+0

Это не работает. ** transparentGUI.png ** все еще имеет фон. Кроме того, загрузка этого изображения в Gray Scale вызывает сбой. – Chris92

+0

Загрузка в geayscale вам нужно использовать код CV_GRAY2BGRA в cvrColor. Если ai запускает код, мое изображение png result имеет прозрачность. Вы открыли его в GIMP? некоторый зритель всегда показывает фон – Micka

+0

'cvtColor' с' CV_GRAY2BGRA' также вызывает сбой. Я проверил в GIMP - и все еще есть. Где я могу сделать ошибку? – Chris92