【发布时间】:2013-01-12 08:48:57
【问题描述】:
基本上我正在尝试将下面的输出图像转换为颜色(RGB)。此代码当前输出的图像是灰度图像,但是,对于我的应用程序,我希望它以彩色输出。请让我知道我应该在哪里转换图像。
下面的代码也是 C++,它使用了来自 openCV 的函数。请记住,我正在使用包装器在我的 iphone 应用程序中使用此代码。
cv::Mat CVCircles::detectedCirclesInImage(cv::Mat img, double dp, double minDist, double param1, double param2, int min_radius, int max_radius) {
//(cv::Mat img, double minDist, int min_radius, int max_radius)
if(img.empty())
{
cout << "can not open image " << endl;
return img;
}
Mat cimg;
medianBlur(img, img, 5);
cvtColor(img, cimg, CV_GRAY2RGB);
vector<Vec3f> circles;
HoughCircles( img //InputArray
, circles //OutputArray
, CV_HOUGH_GRADIENT //int method
, 1//dp //double dp=1 1 ... 20
, minDist //double minDist=10 log 1...1000
, 100//param1 //double param1=100
, 30//param2 //double param2=30 10 ... 50
, min_radius //int minRadius=1 1 ... 500
, max_radius //int maxRadius=30 1 ... 500
);
for( size_t i = 0; i < circles.size(); i++ )
{
Vec3i c = circles[i];
circle( cimg, Point(c[0], c[1]), c[2], Scalar(255,0,0), 3, CV_AA);
circle( cimg, Point(c[0], c[1]), 2, Scalar(0,255,0), 3, CV_AA);
}
return cimg;
}
【问题讨论】:
-
ehmmm 这不是一件容易的事!基本上就像在给定 1+2+3 = 6 的情况下解决以下问题一样,您必须在给定 6 的情况下找到“1,2,3”。不可能有很多总和输出“6”作为数字。由于舍入误差可能会检测到某些颜色(因为每种颜色都有不同的最大亮度),然后使用“自相关”来扩展颜色区域,但最终图像仍然不会具有所有原始颜色并且无论如何都会具有较低的质量因为信息总是丢失。
-
我试图理解灰度到 RGB 的含义。如果您只是指 3 色分量图像,那么您只需将灰度分量复制到 RGB 新创建图像的所有三个 R、G 和 B 分量。如果您真的想在图像中添加颜色,那么您将永远无法获得真正的彩色图像。您充其量只能想出图像的伪彩色版本。这与 IR(红外)图像获取颜色的方式相同。