OpenCV 3.0 连接组件,无法正常工作
OpenCV 3.0 Connected components, can't get it to work properly
我有以下代码,它只是一个简单的测试程序,用于学习如何在 openCV 3.0 中使用连通分量功能
int main(int argc, char** argv) {
char* line = argv[1];
Mat image;
image = imread(line,CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat label=Mat(image.size(),CV_16U);
int la=connectedComponents(image,label, 8,CV_16U);
//tried also: label.convertTo(label,CV_8U,255);
// and label.convertTo(label,CV_16U,255);
namedWindow( "input", CV_WINDOW_AUTOSIZE );
imshow( "input", image);
namedWindow( "ouput", CV_WINDOW_AUTOSIZE );
imshow("output", label);
cout<<la<<"\n";
imwrite("output.png", label);
waitKey(0);
return 0;
}
输入图片是一张白底有两个红色方块的彩色图片。
图像已正确加载并显示为灰度图像。
问题是无论我做什么,输出始终是空白图像,黑色或白色,具体取决于 convertTo
参数。
然而,connectedComponents
返回的值为2。
我尝试了 Miki 提出的完整代码,我明白了:
我认为问题可能是连接的组件无法正常工作。
尝试使用我桌面上的图片,终于得到了一些东西:
然而,这次的源图是一张普通的图片,有人物、建筑、汽车……而且大部分输出仍然是空白的。有人知道为什么吗?
添加后image = image < 200;
使用 applyColorMap(seeMyLabels, seeMyLabels, COLORMAP_JET);
,标签图像从近乎黑色的灰度变为蓝色阴影
结果就在那里,只是你看不到而已!
label
包含每个标签的索引。这意味着,在这种情况下,在标签中你有值的像素:
0 : background
1 : first connected component
2 : second connected component
所以你的图像很暗。仅出于可视化目的,您可以添加此行:
Mat seeMyLabels;
normalize(label, seeMyLabels, 0, 255, NORM_MINMAX, CV_8U);
imshow("Labels", seeMyLabels);
这会将值缩放到可见范围。
请注意,图片应为二值图像,背景为黑色,前景为白色。
完整代码:
#include <opencv2\opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
if (argc != 2) return -1;
Mat image = imread(argv[1], IMREAD_GRAYSCALE);
if (image.empty()) return -1;
Mat label;
int la = connectedComponents(image, label, 8, CV_16U);
Mat seeMyLabels;
normalize(label, seeMyLabels, 0, 255, NORM_MINMAX, CV_8U);
// You can apply a colormap for better visualization
//applyColorMap(seeMyLabels, seeMyLabels, COLORMAP_JET);
imshow("Labels", seeMyLabels);
imshow("input", image);
imshow("output", label);
waitKey(0);
return 0;
}
我有以下代码,它只是一个简单的测试程序,用于学习如何在 openCV 3.0 中使用连通分量功能
int main(int argc, char** argv) {
char* line = argv[1];
Mat image;
image = imread(line,CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat label=Mat(image.size(),CV_16U);
int la=connectedComponents(image,label, 8,CV_16U);
//tried also: label.convertTo(label,CV_8U,255);
// and label.convertTo(label,CV_16U,255);
namedWindow( "input", CV_WINDOW_AUTOSIZE );
imshow( "input", image);
namedWindow( "ouput", CV_WINDOW_AUTOSIZE );
imshow("output", label);
cout<<la<<"\n";
imwrite("output.png", label);
waitKey(0);
return 0;
}
输入图片是一张白底有两个红色方块的彩色图片。
图像已正确加载并显示为灰度图像。
问题是无论我做什么,输出始终是空白图像,黑色或白色,具体取决于 convertTo
参数。
然而,connectedComponents
返回的值为2。
我尝试了 Miki 提出的完整代码,我明白了:
我认为问题可能是连接的组件无法正常工作。
尝试使用我桌面上的图片,终于得到了一些东西:
然而,这次的源图是一张普通的图片,有人物、建筑、汽车……而且大部分输出仍然是空白的。有人知道为什么吗?
添加后image = image < 200;
使用 applyColorMap(seeMyLabels, seeMyLabels, COLORMAP_JET);
,标签图像从近乎黑色的灰度变为蓝色阴影
结果就在那里,只是你看不到而已!
label
包含每个标签的索引。这意味着,在这种情况下,在标签中你有值的像素:
0 : background
1 : first connected component
2 : second connected component
所以你的图像很暗。仅出于可视化目的,您可以添加此行:
Mat seeMyLabels;
normalize(label, seeMyLabels, 0, 255, NORM_MINMAX, CV_8U);
imshow("Labels", seeMyLabels);
这会将值缩放到可见范围。
请注意,图片应为二值图像,背景为黑色,前景为白色。
完整代码:
#include <opencv2\opencv.hpp>
using namespace cv;
int main(int argc, char** argv)
{
if (argc != 2) return -1;
Mat image = imread(argv[1], IMREAD_GRAYSCALE);
if (image.empty()) return -1;
Mat label;
int la = connectedComponents(image, label, 8, CV_16U);
Mat seeMyLabels;
normalize(label, seeMyLabels, 0, 255, NORM_MINMAX, CV_8U);
// You can apply a colormap for better visualization
//applyColorMap(seeMyLabels, seeMyLabels, COLORMAP_JET);
imshow("Labels", seeMyLabels);
imshow("input", image);
imshow("output", label);
waitKey(0);
return 0;
}