2015-01-05 3 views
2

안녕하세요, 인터넷에서 RGB 픽셀 값을 HSV로 변환하는 알고리즘을 많이 찾을 수 있지만 표시 할 수있는 기능을 찾을 수 없습니다. MS Visual Studio 2013 및 openCV 라이브러리를 사용하고 있습니다. HSV 이미지를 얻는 기능이 내장되어 있습니다. cvtColor (obrazeczek1, obrazeczek1, CV_BGR2HSV);하지만이 기능없이이 작업을 시도합니다.C++에서 RGBtoHSV 변환기 함수를 사용한 후 HSV 이미지를 표시하는 방법은 무엇입니까?

#define NORMALIZE_RGB(x) \ 
    (x > 255 ? 255 : (x < 0 ? 0 : x)) 

cv::Mat rgb2grey(cv::Mat& I) 
{ 
CV_Assert(I.depth() != sizeof(uchar)); 
cv::Mat res(I.rows, I.cols, CV_8UC3); 
switch (I.channels()) { 
case 3: 
    cv::Mat_<cv::Vec3b> _I = I; 
    cv::Mat_<cv::Vec3b> _R = res; 

    for (int i = 0; i < I.rows; ++i) 
     for (int j = 0; j < I.cols; ++j){ 

     int grey = ((_I(i, j)[0]) + (_I(i, j)[1]) + (_I(i, j)[2]))/3; 

      _I(i, j)[0] = NORMALIZE_RGB(grey); 
      _I(i, j)[1] = NORMALIZE_RGB(grey); 
      _I(i, j)[2] = NORMALIZE_RGB(grey); 
     } 

    res = _I; 
    break; 
} 
return res; 
} 

및 기능과 디스플레이 이미지를 호출 : 예를 들어, 함수를 사용하여 회색 이미지 I를 얻을 수

cv::Mat image = cv::imread("name.jpg"); 
cv::Mat img = rgb2grey(image); 
cv::imshow("Grey image", img); 

는 여기 Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both 팁을 발견했다. RGB 픽셀을 HSV로 변환하는 방법을 알고 있지만이 행렬을 표시하는 방법은 입니다. imshow? 나는 또한 rgb2hsv 함수를 찾았지만 무엇을 변경해야하는지 알지 못한다. 이것은 함수입니다.

void rgb2hsv(double r, double g, double b, double &h, double &s, double &v) 
{ 
v = max(max(r, g), b); 
double t = min(min(r, g), b); 
double delta = v - t; 
if (v != 0.0) 
    s = delta/v; 
else 
    s = 0.0; 
if (s == 0.0) 
    h = 0.0; 
else 
{ 
    if (r == v) 
     h = (g - b)/delta; 
    else 
     if (g == v) 
      h = 2.0 + (b - r)/delta; 
     else 
      if (b == v) 
       h = 4.0 + (r - g)/delta; 
    h = h * 60.0; 
    if (h < 0.0) 
     h += 360; 
} 
} 

여기 비슷한 질문이 없으므로 plese help.

+1

미디어 나 그래픽 컨트롤러는 무엇입니까? 많은 그래픽 컨트롤러에는 HSV를 직접 지원하는 API가 없습니다. 컬러 프린터로 보내십니까? –

+0

나는 마더 보드에 그래픽 카드 (인텔 HD3000) 만 내장했지만이 내장 기능 CV_BGR2HSV를 사용하면 색상 차이 RGB와 HSV가 표시됩니다. –

+3

HSV 변경 사항을 다시 RGB로 변환해야 표시 될 수 있습니다. –

답변

2

imshow()를 사용하여 HSV로 변환 된 이미지를 표시하는 것이 적절하지 않습니다.

imshow() 생각하면 매트릭스는 BGR 순서입니다. 이미지를 HSV로 변환하면 RGB 값이 HSV 채널 값으로 변환됩니다.

3 채널 이전이었고 변환 후에도 3 채널이지만 다른 값입니다. imshow() 여전히 이미지를 RGB 이미지로 표시하려고하지만 HSV 값으로 표시하면 잘못된 이미지가 표시됩니다.

imshow() 이미지를 올바르게 표시하려면 RGB로 다시 변환하십시오.

편집

Mat hsv, bgr; // hsv is the hsv image you want to display 
cvtColor(hsv, bgr, CV_HSV2BGR); 
imshow("lolz", bgr);