2013-04-24 7 views
5

빨강 녹색 또는 파란색으로 각 픽셀을 색칠하여 분할하려고하는 이미지가 있습니다. 각 픽셀에 대한 신뢰도 점수를 계산하고 신뢰도를 반영하도록 픽셀의 알파 투명도를 조정하려고합니다. 즉, 낮은 신뢰도는 거의 투명합니다. OpenCV에서이 작업을 수행 할 수있는 방법이 있습니까? 누구도 최소한 침략적 라이브러리 (C++)를 제안 할 수 있습니까?OpenCV : 픽셀의 알파 투명도 설정 방법

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

표시되는 이미지는 그냥 모든 블루 (투명도)이며, 단지 완전히 투명한 이미지 : Aurellius에 의해 제안

내가 4 채널 8 비트 Mat를 사용하여 시도 할 수 있습니다, 여기에 코드입니다.

답변

5

이렇게하려면 여러 가지 방법이 있습니다. 한 가지 가능한 방법은 각 개별 픽셀을 액세스하고 수정하는 것입니다. image 가정하면되는 4 채널, 8 비트 cv::Mat : ij 이미지 픽셀의 인덱스이다

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

.

아마도 더 우아할만한 다른 방법이 있지만 현재 코드에 따라 달라집니다.

업데이트 : 설명하는 동작이 예상됩니다. Apparentlycv::imshow()은 투명성을 지원하지 않습니다. 이것은 왜 당신의 디스플레이 된 이미지가 모두 푸른 색인지를 설명합니다.

저장된 이미지는 이미지가 CV_8UC4 인 것을 기억하는 것이 중요합니다. 즉, 각 채널 요소는 uchar으로 저장됩니다. 0.5 값을 할당하면 0으로 잘려서 완전히 투명한 이미지로 저장됩니다.

신뢰도가 [0,1] 범위의 부동 소수점 값이면 255로 스케일링하여 8 비트 이미지가 지원하는 범위에 두십시오. 따라서

v[3] = 0.5; 

v[3] = 0.5 * 255; 
+0

이것이 작동하지 않는 것 같습니다. 업데이트 된 질문을 참조하십시오. – Aly

+0

@Aly이 답변을 시도했지만 효과가있었습니다. – Kiran

3

된다 또한 동일한 문제가 있었다했지만 투명 도형을 드로잉 할 때 이미지를 혼합하여 해결. 내가 OpenCV의 설명서이를 위해

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

의 원천이했습니다 당신이 this 문서 기사를 살펴하는 것이 좋습니다. 희망이 도움이 될 것입니다.

관련 문제