2
鉴于包含用于每个像素的标签(其中一个标签只是在0..N-1
索引)一个CV_32SC1 cv::Mat
图像,什么是在OpenCV中最干净的码以产生CV_8UC3
图像显示每个连接的部件有不同的任意颜色?如果我不需要手动指定颜色,与cv::floodFill
一样,效果更好。创建RGB图像从像素标签
鉴于包含用于每个像素的标签(其中一个标签只是在0..N-1
索引)一个CV_32SC1 cv::Mat
图像,什么是在OpenCV中最干净的码以产生CV_8UC3
图像显示每个连接的部件有不同的任意颜色?如果我不需要手动指定颜色,与cv::floodFill
一样,效果更好。创建RGB图像从像素标签
如果标签的最大数量是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;
}
你有超过256个标签的更多?如果没有,你可以使用[applyColorMap](http://docs.opencv.org/2.4/modules/contrib/doc/facerec/colormaps.html)。 _Arbitrary_颜色意味着_random_,或者像色彩映射? – Miki
随机和色图都可以。 – ChronoTrigger
你确定'CV_32UC1'(不存在)?或者你的意思是'CV_32SC1'? – Miki