超像素分割例程
代码如下(示例):
#include <opencv2/opencv.hpp>
#include <opencv2/ximgproc.hpp>
#include <iostream>
int main() {
// 读取图片
cv::Mat img = cv::imread("C:\\Users\\svs\\Desktop\\test.jpeg");
if (img.empty()) {
std::cerr << "无法读取图片!" << std::endl;
return -1;
}
// 初始化SLIC参数,超像素平均尺寸20,平滑因子20.0
int region_size = 20;
float ruler = 20.0;
int num_iterations = 10;
// 创建SLIC超像素对象,SLICO 使用自适应紧致因子
cv::Ptr<cv::ximgproc::SuperpixelSLIC> slic = cv::ximgproc::createSuperpixelSLIC(img, cv::ximgproc::SLICO, region_size, ruler);
// 运行SLIC算法,进行迭代
slic->iterate(num_iterations);
// 获取超像素边界的掩码
cv::Mat mask_slic;
slic->getLabelContourMask(mask_slic);
imshow("maks", mask_slic);
// 获取超像素的标签
cv::Mat label_slic;
slic->getLabels(label_slic);
std::cout << label_slic << std::endl;
// 获取超像素的数量
int number_slic = slic->getNumberOfSuperpixels();
std::cout << "超像素数量: " << number_slic << std::endl;
// 反转掩码
cv::Mat mask_inv_slic;
cv::bitwise_not(mask_slic, mask_inv_slic);
// 在原图上应用掩码,绘制超像素边界
cv::Mat img_slic;
img.copyTo(img_slic, mask_inv_slic);
// 显示结果
cv::imshow("Original Image", img);
cv::imshow("SLIC Superpixels", img_slic);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}