2013-04-24 8 views
5

Mam obraz, który próbuję posegmentować, kolorując każdy piksel albo na czerwono, albo na niebiesko. Obliczyłem wynik zaufania dla każdego piksela i chcę dostosować przezroczystość alfa piksela, aby odzwierciedlić zaufanie, tj. Niski poziom zaufania oznacza prawie przezroczysty. Czy jest jakiś sposób, aby to zrobić w OpenCV? Jeśli nie, to czy ktoś może zaproponować minimalnie inwazyjną bibliotekę (C++)?OpenCV: jak ustawić przezroczystość alfa piksela

Mam prób przy użyciu 4 kanału 8-bitowego Mat jak sugeruje Aurellius, oto kod:

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

Obraz widoczny jest po prostu wszystko niebieski (bez przezroczystości), a obraz tylko w pełni przejrzyste.

Odpowiedz

5

Istnieje wiele sposobów, aby to osiągnąć. Jednym z możliwych sposobów jest uzyskiwanie dostępu i modyfikowanie każdego pojedynczego piksela. Zakładając, image jest czterokanałowy, 8-bitowy cv::Mat:

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

gdzie i i j są indeksy piksela w obrazie.

Istnieją inne metody, które są prawdopodobnie bardziej eleganckie, ale będą zależeć od obecnego kodu.

AKTUALIZACJA: Opisanego zachowania można się spodziewać. Apparentlycv::imshow() nie obsługuje przezroczystości. To tłumaczy, dlaczego wyświetlany obraz jest cały niebieski.

Co do zapisanego obrazu, ważne jest, aby pamiętać, że obraz jest typu CV_8UC4. Oznacza to, że każdy element kanału jest przechowywany jako uchar. Przypisanie wartości 0.5 spowoduje obcięcie do zera, a więc w pełni przezroczystego zapisanego obrazu.

Jeśli twoja pewność jest wartością zmiennoprzecinkową w zakresie [0,1], przeskaluj ją o 255, aby ustawić ją w zakresie obsługiwanym przez obrazy 8-bitowe. Zatem

v[3] = 0.5; 

staje

v[3] = 0.5 * 255; 
+0

To nie działa, zobacz zaktualizowane pytanie – Aly

+0

@Aly Próbowałem tej odpowiedzi i zadziałało. – Kiran

3

miałem również ten sam problem, ale gdy zbliżał przejrzyste kształty i rozwiązać go przez mieszanie obrazów. mam źródło to w dokumentacji OpenCV za

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

W tym celu proponuję przyjrzeć this dokumentacji wyrobu. Mam nadzieję, że to pomoże.

Powiązane problemy