要将彩色图像按连通域区分,您可以使用 OpenCV 中的 cv::connectedComponents
函数。
下面是一个简单的示例代码,说明如何使用 cv::connectedComponents
函数来检测并标记图像中的连通域:
- #include <opencv2/opencv.hpp>
- #include <iostream>
-
- int main()
- {
- // 读取彩色图像
- cv::Mat image = cv::imread("image.jpg");
-
- // 将图像转换为灰度
- cv::Mat grayImage;
- cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
-
- // 使用二值化将图像转换为二进制图像
- cv::Mat binaryImage;
- cv::threshold(grayImage, binaryImage, 0, 255, cv::THRESH_BINARY_INV | cv::THRESH_OTSU);
-
- // 定义连通域标记图像
- cv::Mat labels;
-
- // 应用连通域检测算法
- int numLabels = cv::connectedComponents(binaryImage, labels);
-
- // 创建随机颜色向量,用于绘制每个连通域
- std::vector<cv::Vec3b> colors(numLabels);
- colors[0] = cv::Vec3b(0, 0, 0); // 背景设置为黑色
-
- for (int i = 1; i < numLabels; i++)
- {
- colors[i] = cv::Vec3b(rand() % 256, rand() % 256, rand() % 256);
- }
-
- // 将每个连通域根据其标签值着色
- cv::Mat connectedComponentsImage(image.size(), CV_8UC3);
- for (int y = 0; y < image.rows; y++)
- {
- for (int x = 0; x < image.cols; x++)
- {
- int label = labels.at<int>(y, x);
- cv::Vec3b &color = connectedComponentsImage.at<cv::Vec3b>(y, x);
-
- color = colors[label];
- }
- }
-
- // 显示原始图像和标记的连通域图像
- cv::imshow("Original Image", image);
- cv::imshow("Connected Components", connectedComponentsImage);
- cv::waitKey(0);
-
- return 0;
- }
这段代码首先读取彩色图像,然后将其转换为灰度图像。接下来,使用 cv::threshold
函数将灰度图像二值化,生成二进制图像。然后,使用 cv::connectedComponents
函数应用连通域检测算法。最后,根据每个连通域的标签值,使用随机颜色向量对每个连通域进行着色。最后,将原始图像和标记的连通域图像显示出来。
您可以根据您的需求修改此示例代码。
8/29/2023, 2:06:42 PM