2010-06-10 81 views
10

Khi tôi chạy mã này sau trên một hình ảnh mẫu (RGB), và sau đó xử lý nó để hiển thị hình ảnh HSV chuyển đổi, Cả hai dường như khác nhau ...OpenCV hình ảnh chuyển đổi từ RGB để HSV

bất cứ ai có thể giải thích tại sao điều này xảy ra?
HOẶC
bạn có thể đề xuất một giải pháp cho điều này không xảy ra ... bởi vì đó là cùng một hình ảnh sau khi tất cả

Mat img_hsv,img_rgb,red_blob,blue_blob; 
img_rgb = imread("pic.png",1); 
cvtColor(img_rgb,img_hsv,CV_RGB2HSV); 
namedWindow("win1", CV_WINDOW_AUTOSIZE); 
imshow("win1", img_hsv); 
+0

Bạn cần phải chuyển đổi hình ảnh 'HSV' trở về' BGR' để hiển thị nó bằng 'imshow()'. – smwikipedia

Trả lời

24
  1. Tôi không biết mới (2.x) OpenCV cũng đủ tuy nhiên, thông thường, hình ảnh được tải trong OpenCV nằm trong thứ tự CV_BGR và không phải RGB, do đó bạn có thể muốn CV_BGR2HSV

  2. OpenCV không thực sự "biết" HSV, nó sẽ mã hóa Hue ở kênh đầu tiên, Saturation trong giây và Giá trị thứ ba. Nếu bạn hiển thị một hình ảnh trong OpenCV, highgui giả định đó là một hình ảnh BGR, do đó giải thích các kênh đầu tiên (nay là Huế) như màu xanh, vv

+0

thậm chí tôi đã thử rằng dude ... din làm việc hoặc ... chỉ là một chút thay đổi nhỏ trong hình ảnh đầu ra ... cũng không phải nó sử dụng các công thức sau đây để chuyển đổi các hình ảnh được đưa ra trong http: //opencv.willowgarage .com/documentation/cpp/miscellaneous_image_transformations.html – Kaushal

+1

@kaushalyjain: vâng, nhưng như tôi đã nói: Hue kết thúc ở kênh đầu tiên, S ở vị trí thứ 2, V ở vị trí thứ 3. imshow không giải thích các không gian màu, nó giả định BGR (ít nhất đó là trường hợp với pre-2.x cvShowImage). Những gì bạn thấy là HSV được mã hóa là BGR;) – zerm

+0

oh! hiểu rồi ... cảm ơn rất nhiều !! Tôi có một câu hỏi khác dựa trên điều này ... tôi sẽ đăng nó như một câu hỏi mới .. xin vui lòng mất đau để trả lời rằng cũng ... !! :) – Kaushal

3

Vì nó đã được giải thích ở đây rồi, nó làm cho không có ý nghĩa để hiển thị hình ảnh ngay sau khi nó được chuyển thành HSV, tuy nhiên đây là ví dụ về cách sử dụng kênh V:

Nếu bạn chỉ muốn trích xuất kênh V, bạn có thể sử dụng cvtColor và sử dụng kênh thứ ba (V) từ hình ảnh HSV cường độ bản sao màu xám của hình ảnh này:

Mat grayImg, hsvImg; 
cvtColor(img, grayImg, CV_BGR2GRAY); 
cvtColor(img, hsvImg, CV_BGR2HSV); 
uchar* grayDataPtr = grayImg.data; 
uchar* hsvDataPtr = hsvImg.data; 
for (int i = 0; i < img.rows; i++) 
{ 
    for (int j = 0; j < img.cols; j++) 
    { 
     const int hi = i*img.cols*3 + j*3, 
        gi = i*img.cols + j; 
     grayDataPtr[gi] = hsvDataPtr[hi + 2]; 
    } 
} 
imshow("V-channel", grayImg); 
Các vấn đề liên quan