I am trying to cluster a grayscale image using Kmeans.
First, I have a question:
Is Kmeans the best way to cluster a Mat or are there newer more efficient approaches?
Second, when I try this:
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);
The result (outputImage
) is empty.
When I try to multiply colors
in the for loop like data.at<float>(i) = 255 * colors(labels[i]);
I get this error:
Unhandled exception : Integer division by zero.
How can I cluster a grayscale image properly?