2016-03-14 96 views
2

鑑於包含用於每個像素的標籤(其中一個標籤只是在0..N-1索引)一個CV_32SC1 cv::Mat圖像,什麼是在OpenCV中最乾淨的碼以產生CV_8UC3圖像顯示每個連接的部件有不同的任意顏色?如果我不需要手動指定顏色,與cv::floodFill一樣,效果更好。創建RGB圖像從像素標籤

+0

你有超過256個標籤的更多?如果沒有,你可以使用[applyColorMap](http://docs.opencv.org/2.4/modules/contrib/doc/facerec/colormaps.html)。 _Arbitrary_顏色意味着_random_,或者像色彩映射? – Miki

+0

隨機和色圖都可以。 – ChronoTrigger

+0

你確定'CV_32UC1'(不存在)?或者你的意思是'CV_32SC1'? – Miki

回答

1

如果標籤的最大數量是256,你可以使用applyColorMap,將圖像轉換爲CV_8U

Mat1i img = ... 

// Convert to CV_8U 
Mat1b img2; 
img.convertTo(img2, CV_8U); 

// Apply color map 
Mat3b out; 
applyColorMap(img2, out, COLORMAP_JET); 

如果標籤數大於256,則需要自己做。下面是一個生成JET顏色映射的示例(它基於jet函數的Matlab實現)。然後,您可以爲矩陣的每個元素應用顏色貼圖。

請注意,如果你想有一個不同的顏色表,或隨機的顏色,你只需要修改//Create JET colormap部分:

#include <opencv2/opencv.hpp> 
#include <algorithm> 
using namespace std; 
using namespace cv; 

void applyCustomColormap(const Mat1i& src, Mat3b& dst) 
{ 
    // Create JET colormap 

    double m; 
    minMaxLoc(src, nullptr, &m); 
    m++; 

    int n = ceil(m/4); 
    Mat1d u(n*3-1, 1, double(1.0)); 

    for (int i = 1; i <= n; ++i) { 
     u(i-1) = double(i)/n; 
     u((n*3-1) - i) = double(i)/n; 
    } 

    vector<double> g(n * 3 - 1, 1); 
    vector<double> r(n * 3 - 1, 1); 
    vector<double> b(n * 3 - 1, 1); 
    for (int i = 0; i < g.size(); ++i) 
    { 
     g[i] = ceil(double(n)/2) - (int(m)%4 == 1 ? 1 : 0) + i + 1; 
     r[i] = g[i] + n; 
     b[i] = g[i] - n; 
    } 

    g.erase(remove_if(g.begin(), g.end(), [m](double v){ return v > m;}), g.end()); 
    r.erase(remove_if(r.begin(), r.end(), [m](double v){ return v > m; }), r.end()); 
    b.erase(remove_if(b.begin(), b.end(), [](double v){ return v < 1.0; }), b.end()); 

    Mat1d cmap(m, 3, double(0.0)); 
    for (int i = 0; i < r.size(); ++i) { cmap(int(r[i])-1, 2) = u(i); } 
    for (int i = 0; i < g.size(); ++i) { cmap(int(g[i])-1, 1) = u(i); } 
    for (int i = 0; i < b.size(); ++i) { cmap(int(b[i])-1, 0) = u(u.rows - b.size() + i); } 

    Mat3d cmap3 = cmap.reshape(3); 

    Mat3b colormap; 
    cmap3.convertTo(colormap, CV_8U, 255.0); 


    // Apply color mapping 
    dst = Mat3b(src.rows, src.cols, Vec3b(0,0,0)); 
    for (int r = 0; r < src.rows; ++r) 
    { 
     for (int c = 0; c < src.cols; ++c) 
     { 
      dst(r, c) = colormap(src(r,c)); 
     } 
    } 
} 

int main() 
{ 
    Mat1i img(1000,1000); 
    randu(img, Scalar(0), Scalar(10)); 

    Mat3b out; 
    applyCustomColormap(img, out); 

    imshow("Result", out); 
    waitKey(); 

    return 0; 
}