2013-04-24 10 views
5

Ich habe ein Bild Ich versuche zu segmentieren, indem Sie jedes Pixel entweder rot grün oder blau färben. Ich habe einen Konfidenzwert für jedes Pixel berechnet und möchte die Alphatransparenz des Pixels anpassen, um das Vertrauen widerzuspiegeln, d. H. Eine niedrige Konfidenz bedeutet fast transparent. Gibt es eine Möglichkeit, dies in OpenCV zu tun? Wenn nicht, kann jemand eine minimal-invasive Bibliothek vorschlagen (C++)?OpenCV: Wie Alpha Transparenz eines Pixels einstellen

I haben versucht, einen 4-Kanal-8-Bit unter Verwendung Mat wie durch Aurellius vorgeschlagen, ist hier der Code:

cv::Mat m = cv::Mat(20,20, CV_8UC4); 
    for(int i = 0; i < m.rows; i++){ 
     for(int j = 0; j < m.cols; j++){ 
      Vec4b& v = m.at<Vec4b>(i,j); 
      v[0] = 255; 
      v[1] = 0; 
      v[2] = 0; 
      v[3] = 0.5; 
     } 
    } 

    imwrite("alpha.png", m); 
    namedWindow("m"); 
    imshow("m", m); 
    waitKey(0); 

Die gezeigte Abbildung nur alle blau (keine Transparenz) und das Bild nur vollständig transparent.

Antwort

5

Es gibt viele Möglichkeiten, dies zu erreichen. Eine Möglichkeit besteht darin, auf jedes einzelne Pixel zuzugreifen und es zu modifizieren. Unter der Annahme, image ist ein Vier-Kanal-8-Bit-cv::Mat:

auto& pixel = image.at<cv::Vec4b>(i,j); 
pixel[3] = confidence; 

wo ij und die Indizes des Pixels in dem Bild sind.

Es gibt andere Methoden, die wahrscheinlich eleganter sind, aber sie werden von Ihrem aktuellen Code abhängen.

UPDATE: Das Verhalten, das Sie beschreiben, ist zu erwarten. Apparentlycv::imshow() unterstützt keine Transparenz. Dies erklärt, warum Ihr angezeigtes Bild blau ist.

Wie für das gespeicherte Bild ist es wichtig, dass das Bild vom Typ CV_8UC4 ist. Das bedeutet, dass jedes Kanalelement als uchar gespeichert wird. Wenn Sie einen Wert von 0.5 zuweisen, wird der Wert auf Null reduziert, daher das vollständig transparente gespeicherte Bild.

Wenn Ihre Konfidenz ein Gleitkommawert im Bereich [0,1] ist, skalieren Sie sie um 255, um sie in den von 8-Bit-Bildern unterstützten Bereich zu setzen. So

v[3] = 0.5; 

v[3] = 0.5 * 255; 
+0

Dies scheint nicht zu funktionieren, siehe aktualisierte Frage – Aly

+0

@Aly ich versuchte diese Antwort und es hat funktioniert. – Kiran

3

wird habe ich hatte auch das gleiche Problem, aber wenn transparente Formen zeichnete und löste es durch Bilder verschmelzen. Ich habe diese Quelle in OpenCV Dokumentation

if you want to paint semi-transparent shapes, you can paint them in a separate buffer and then blend it with the main image. 

Zu diesem Zweck empfehle ich Ihnen einen Blick auf this Dokumentation Artikel in Anspruch zu nehmen. Hoffe, das wird helfen.

Verwandte Themen