2013-04-04 5 views
4

분리 기능을 사용하여 만든 3 개의 회색 음영 이미지가 있습니다. 이제 다시 컬러 이미지를 재생성하고 싶습니다. 다음 코드를 시도했지만 작동하지 않았습니다. 내가 얻은 결과 이미지는 회색 음영이었다. opencv에서 3 개의 그레이 스케일 [R, G, B] 이미지를 단일 컬러 이미지로 병합

 cv::Mat R = cv::imread("/home/r/secret_R.png",0); 
     cv::Mat G = cv::imread("/home/r/secret_G.png",0); 
     cv::Mat B = cv::imread("/home/r/secret_B.png",0); 
     std::vector<cv::Mat> array_to_merge; 
     array_to_merge.push_back(R); 
     array_to_merge.push_back(G); 
     array_to_merge.push_back(B); 
     cv::Mat color; 
     cv::merge(array_to_merge, color); 

그래서 그때는 cvtColor 기능 시도 :

 cv::Mat color_converted; 
     cv::cvtColor(color, color_converted, CV_GRAY2BGR); 
     cv::imwrite("/home/r/color_secret.png",color_converted); 

을하지만, 분명히, 그것은 단지 단 하나의 채널이 소스 이미지에 적용됩니다. 나는 내 그레이 스케일 이미지 중 하나 통과 :

cv::cvtColor(R, color_converted, CV_GRAY2BGR); 

을하지만 난 여전히 다시 컬러 이미지를 가져올 수 없습니다. 결과 이미지가 회색 음영이었습니다

내가 뭘 잘못하고 있니? 내 컬러 이미지를 다시 얻으려면 어떻게해야합니까?

+0

PNG 파일은 회색 픽셀 만있는 RGB 이미지가 아니라 회색 음영으로 인코딩되어 있습니까? 병합을하기 전에 OpenCV를 사용하여 R, G 및 B를 회색조로 변환하려고합니다. –

+0

예, 확실히 회색 음영 단일 채널 이미지입니다, – Chani

답변

11

코드에 문제가없는 것 같습니다. 나는 그것이 소스 데이터 일 수도 있고 수입업자가 어떻게 대우 받고 있는지 의심 스럽다. 이미지를로드 한 후 이미지 메타 데이터를 인쇄하여 OpenCV가 읽는 속성을 볼 수 있습니까? 그들 모두는 동일한 차원과 단일 채널을 가져야합니다.

std::cout << "Red: " << R.size().width << " x " << R.size().height << " x " << R.channels() << std::endl; 
std::cout << "Green: " << G.size().width << " x " << G.size().height << " x " << G.channels() << std::endl; 
std::cout << "Blue: " << B.size().width << " x " << B.size().height << " x " << B.channels() << std::endl; 

방금 ​​헤더와 메인이 추가 된 프로그램을 실행했습니다. 나는 하나의 작은 변화를 만들어 B, G, R 순서 (기본값)로 병합했다. Mac OS X 10.8에서 다음과 같이 컴파일했습니다. OpenCV 버전 2.4.3에 대한

g++ -o merge merge.cpp -lopencv_core -lopencv_highgui 

#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/core/core.hpp> 

int main(int argc, char* argv[]) 
{ 
    cv::Mat R = cv::imread("chan_dest_red.png", 0); 
    cv::Mat G = cv::imread("chan_dest_green.png", 0); 
    cv::Mat B = cv::imread("chan_dest_blue.png", 0); 

    std::vector<cv::Mat> array_to_merge; 

    array_to_merge.push_back(B); 
    array_to_merge.push_back(G); 
    array_to_merge.push_back(R); 

    cv::Mat color; 

    cv::merge(array_to_merge, color); 

    imwrite("merged.png", color); 

    return 0; 
} 

나는 다른 프로젝트에서 일부 단일 채널 이미지는 이미 파일로 분할했고, 나는 단지 하나의 컬러 이미지로 사람들을 합병하고 그냥 괜찮 았는데. 소스 파일 정보는 다음과 같습니다.

Red: 500 x 333 x 1 
Green: 500 x 333 x 1 
Blue: 500 x 333 x 1 
+0

Congrat - 내가 찾은 최고의 답변 중 하나. – peterh

1

한가지 방법은 의 기능을 이용하여 루프에서 다음 번 채널의 컬러 화상을 생성 할 cvtColor를 이용해 다른 두 색을 픽셀 단위로 대체하는 것이다. 행렬 연산자를 사용하면이 작업을 더 쉽게 수행 할 수있는 방법이 있지만 실제로 openCV에 익숙하지 않아서 알 수 있습니다.

+3

죄송 합니다만 매우 비효율적이며 느린 방법입니다. 'cv :: merge()'함수는 최적화 된 방법으로 이것에 정확하게 설계되었습니다. – gavinb

관련 문제