基本上我正在尝试将下面的输出图像转换为颜色(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;
}
当前设置为需要灰度图像作为输入。我认为您正在询问如何调整它以接受彩色输入图像并返回彩色输出图像。您不需要做太多更改:
cv::Mat CVCircles::detectedCirclesInImage(cv::Mat img, double dp, double minDist, double param1, double param2, int min_radius, int max_radius) {
if(img.empty())
{
cout << "can not open image " << endl;
return img;
}
Mat img;
if (img.type()==CV_8UC1) {
//input image is grayscale
cvtColor(img, cimg, CV_GRAY2RGB);
} else {
//input image is colour
cimg = img;
cvtColor(img, img, CV_RGB2GRAY);
}
其余的保持原样。
如果您的输入图像是彩色的,则将其转换为灰色以供HoughCircles处理,并将找到的圆圈应用于原始彩色图像以进行输出。
cvtImage 例程将简单地将灰色元素复制到每个像素的三个元素 R、G 和 B 中的每一个。 换句话说,如果像素灰度值为 26,则新图像将具有 R = 26、G = 26、B = 26。
即使包含所有 3 种颜色分量,呈现的图像仍将是灰度,您所做的只是将存储相同图像所需的空间增加三倍。
如果您确实希望颜色出现在图像中(当您查看它时),这确实不可能从灰度恢复到原始颜色。 但是,有一些伪着色或假着色图像的方法。
http://en.wikipedia.org/wiki/False_color
http://blog.martinperis.com/2011/09/opencv-pseudocolor-and-chroma-depth.html
http://podeplace.blogspot.com/2012/11/opencv-pseudocolors.html
您粘贴的代码正在返回彩色图像。
你已经在做cvtColor(img,cimg,CV_GRAY2RGB),然后我没有看到cimg在任何地方被转换为灰度!,要验证它,请尝试在从此函数返回之前显示它:
imshow("c",cimg);
waitKey(0);
return cimg;
您可以为输入彩色图像绘制圆圈。检查 openCV 中给出的文档
http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html