OpenCV: вычислительные суперпиксельные центроиды

Фон:

Я вычислил SLIC суперпиксели изображения, используя gSLICr, который дает «карту на пиксель» суперпикселей изображения в виде индексов (от 0 до количества суперпикселей-1).

Эта карта является указателем на массив целочисленных констант (const int*) содержащие индексы.

Теперь я хочу вычислить центроиды каждого суперпикселя, используя OpenCV.

Исходя из фона Matlab, я бы сделал это с помощью regionprops:

segments = vl_slic(myImage, regionSize, regularizer);
stats = regionprops(segments, 'Centroid');
centroids = cat(1, stats.Centroid);

Я не знаю, как это сделать с помощью OpenCV.

Вопросы:

(i) Как мне конвертировать const int* массив к cv::Mat?

(ii) Как мне вычислить суперпиксельные центроиды из матрицы в (i)?

0

Решение

Поскольку на первые вопросы, похоже, дан ответ, я остановлюсь на втором вопросе. Я использовал следующий код для вычисления средних координат (то есть пространственных центроидов) каждого суперпикселя:

/** \brief Compute the mean coordinates of each superpixel (i.e. spatial centroids).
* \param[in] labels a matrix of type CV_32SC1 holding the labels for each pixel
* \param[out] means the spatial centroids (or means in y and x axes) of the superpixels
*/
void getMeans(const cv::Mat &labels, std::vector<cv::Vec2f> &means) {

// Count superpixels or get highest superpixel index:
int superpixels = 0;
for (int i = 0; i < labels.rows; ++i) {
for (int j = 0; j < labels.cols; ++j) {
if (labels.at<int>(i, j) > superpixels) {
superpixels = labels.at<int>(i, j);
}
}
}

superpixels++;

// Setup means as zero vectors.
means.clear();
means.resize(superpixels);
for (int k = 0; k < superpixels; k++)
{
means[k] = cv::Vec2f(0, 0);
}

std::vector<int> counts(superpixels, 0);

// Sum y and x coordinates for each superpixel:
for (int i = 0; i < labels.rows; ++i) {
for (int j = 0; j < labels.cols; ++j) {
means[labels.at<int>(i, j)][0] += i; // for computing mean i (i.e. row or y axis)
means[labels.at<int>(i, j)][1] += j; // for computing the mean j (i.e. column or x axis)

counts[labels.at<int>(i, j)]++;
}
}

// Obtain averages by dividing by the size (=number of pixels) of the superpixels.
for (int k = 0; k < superpixels; ++k) {
means[k] /= counts[k];
}
}

// Do something with the means ...

Если вам также нужен средний цвет, для метода потребуется изображение в качестве аргумента, но оставшийся код можно легко адаптировать для вычисления средних цветов.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]