Я пытаюсь сгруппировать изображение в градациях серого с помощью Kmeans.
Во-первых, у меня вопрос:
Является ли Kmeans лучшим способом кластеризации мата или есть более новые и более эффективные подходы?
Во-вторых, когда я пытаюсь это сделать:
Mat degrees = imread("an image" , IMREAD_GRAYSCALE);
const unsigned int singleLineSize = degrees.rows * degrees.cols;
Mat data = degrees.reshape(1, singleLineSize);
data.convertTo(data, CV_32F);
std::vector<int> labels;
cv::Mat1f colors;
cv::kmeans(data, 3, labels, cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 10, 1.), 2, cv::KMEANS_PP_CENTERS, colors);
for (unsigned int i = 0; i < singleLineSize; i++) {
data.at<float>(i) = colors(labels[i]);
}
Mat outputImage = data.reshape(1, degrees.rows);
outputImage.convertTo(outputImage, CV_8U);
imshow("outputImage", outputImage);
Результат (outputImage
) пуст.
Когда я пытаюсь умножить colors
в for l oop как data.at<float>(i) = 255 * colors(labels[i]);
Я получаю эту ошибку:
Необработанное исключение: целочисленное деление на ноль.
Как правильно кластеризовать изображение в градациях серого?