2016-03-25 14 views
2

Ich habe dieses Bild in OpenCV imgColorPanel = imread("newGUI.png", CV_LOAD_IMAGE_COLOR);:zu transparent in OpenCV C++

enter image description here

Als ich es laden mit Grauskala imgColorPanel = imread("newGUI.png", CV_LOAD_IMAGE_GRAYSCALE); es sieht wie folgt aus:

enter image description here

Allerdings möchte ich den weißen Hintergrund entfernen oder transparent machen (nur es ist weiße Pixel), so auszusehen:

Wie geht das in C++ OpenCV?

enter image description here

+0

cv :: cvtColor (Eingang, Ausgang, CV_BGR2BGRA); dann für jedes Pixel: Wenn Pixel == weiß, setze den Alpha-Wert dieses Pixels auf Null. – Micka

+0

ah nein, ist dein Eingangsbild schon transparent? Verwenden Sie das Flag CV_LOAD_IMAGE_ANYDEPTH. – Micka

+0

oder verwenden Sie einen negativen Wert wie in http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#imread – Micka

Antwort

8

Sie können das Eingangsbild zu BGRA Kanal (Farbbild mit Alpha-Kanal) konvertieren und dann jedes Pixel ändern, die weiß ist, um den Alpha-Wert auf Null zu setzen.

Sehen Sie diesen Code:

// 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); 

Diese Ihr Bild mit Transparenz sparen. Das Ergebnis Bild mit GIMP geöffnet wie folgt aussieht:

enter image description here

Wie Sie sehen können, einig „weißen Bereiche“ nicht transparent sind, dies bedeutet, dass Ihre derjenigediejenigedasjenige Pixel in dem Eingangsbild nicht vollkommen weiß waren. Stattdessen können Sie versuchen,

// 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

Es scheint nicht zu funktionieren. ** transparentGUI.png ** hat noch Hintergrund. Auch das Laden dieses Bildes in Graustufen verursacht einen Absturz. – Chris92

+0

laden in geayscale Sie müssen CV_GRAY2BGRA Code in cvrColor verwenden. Wenn der Code ausgeführt wird, hat mein PNG-Ergebnisbild Transparenz. Hast du es in GIMP geöffnet? einige Viewer zeigen immer einen Hintergrund – Micka

+0

'cvtColor' mit' CV_GRAY2BGRA' verursacht auch Absturz. Ich habe GIMP eingecheckt - und der Hintergrund ist immer noch da. Wo könnte ich einen Fehler machen? – Chris92