40 clusters = cv::Mat_<int>(image.cols,image.rows,-1);
41 distances = cv::Mat_<double>(image.cols,image.rows,DBL_MAX);
48 cv::Vec3b colour = image.at<cv::Vec3b>(nc.y, nc.x);
51 Vec5d center(colour[0], colour[1], colour[2], nc.x, nc.y);
70 - colour[1], 2) +
pow(cen[2] - colour[2], 2));
71 double ds =
sqrt(
pow(cen[3] - pixel.x, 2) +
pow(cen[4] - pixel.y, 2));
87 double min_grad = DBL_MAX;
88 cv::Point loc_min(center.x, center.y);
90 for (
int i = center.x-1; i < center.x+2; i++) {
91 for (
int j = center.y-1; j < center.y+2; j++) {
92 cv::Vec3b c1 = image(j+1, i);
93 cv::Vec3b c2 = image(j, i+1);
94 cv::Vec3b c3 = image(j, i);
106 min_grad = fabs(i1 - i3) + fabs(i2 - i3);
129 cv::Mat_<cv::Vec3b> image(img);
140 for (
int j = 0; j <
centers.rows; j++) {
143 for (
int k =
int(cen[3]) - step; k <
int(cen[3]) +
step; k++) {
146 if (k >= 0 && k < image.cols && l >= 0 &&
l < image.rows) {
147 cv::Vec3b colour = image(
l, k);
162 for (
int j = 0; j <
centers.rows; j++) {
168 for (
int j = 0; j < image.cols; j++) {
169 for (
int k = 0; k < image.rows; k++) {
173 cv::Vec3b colour = image(k, j);
174 centers(c_id) +=
Vec5d(colour[0], colour[1], colour[2], j, k);
181 for (
int j = 0; j <
centers.rows; j++) {
196 int label = 0, adjlabel = 0;
197 const int lims = (image.cols * image.rows) / (
centers.rows);
199 const int dx4[4] = {-1, 0, 1, 0};
200 const int dy4[4] = { 0, -1, 0, 1};
203 cv::Mat_<int> new_clusters(image.cols,image.rows,-1);
205 for (
int i = 0; i < image.cols; i++) {
206 for (
int j = 0; j < image.rows; j++) {
207 if (new_clusters(i,j) == -1) {
209 elements.push_back(cv::Point(i, j));
212 for (
int k = 0; k < 4; k++) {
213 int x = elements[0].x + dx4[k],
y = elements[0].y + dy4[k];
215 if (x >= 0 && x < image.cols && y >= 0 && y < image.rows) {
216 if (new_clusters(x,y) >= 0) {
217 adjlabel = new_clusters(x,y);
223 for (
int c = 0;
c < count;
c++) {
224 for (
int k = 0; k < 4; k++) {
225 int x = elements[
c].x + dx4[k],
y = elements[
c].y + dy4[k];
227 if (x >= 0 && x < image.cols && y >= 0 && y < image.rows) {
229 elements.push_back(cv::Point(x, y));
230 new_clusters(x,y) = label;
239 if (count <= lims >> 2) {
240 for (
int c = 0;
c < count;
c++) {
241 new_clusters(elements[
c].
x, elements[
c].
y) = adjlabel;
259 for (
int i = 0; i <
centers.rows; i++) {
271 const int dx8[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
272 const int dy8[8] = { 0, -1, -1, -1, 0, 1, 1, 1};
277 cv::Mat_<uchar> istaken(image.cols, image.rows, uchar(0));
280 for (
int i = 0; i < image.cols; i++) {
281 for (
int j = 0; j < image.rows; j++) {
285 for (
int k = 0; k < 8; k++) {
286 int x = i + dx8[k],
y = j + dy8[k];
288 if (x >= 0 && x < image.cols && y >= 0 && y < image.rows) {
297 contours.push_back(cv::Point(i,j));
304 for (
int i = 0; i < (
int)contours.
size(); i++) {
305 image.at<cv::Vec3b>(contours[i].y, contours[i].x) = colour;
319 for (
size_t i = 0; i < colours.
size(); i++) {
320 colours[i] = cv::Vec3i(0, 0, 0);
323 for (
int i = 0; i < image.cols; i++) {
324 for (
int j = 0; j < image.rows; j++) {
329 cv::Vec3b
c = image.at<cv::Vec3b>(j, i);
330 colours[index][0] += (c[0]);
331 colours[index][1] += (c[1]);
332 colours[index][2] += (c[2]);
337 for (
int i = 0; i < (
int)colours.
size(); i++) {
342 for (
int i = 0; i < image.cols; i++) {
343 for (
int j = 0; j < image.rows; j++) {
345 image.at<cv::Vec3b>(j, i) = cv::Vec3b(c[0], c[1], c[2]);
void create_connectivity(const cv::Mat &image)
cv::Mat_< Vec5d > centers
vector< int > center_counts
double compute_dist(int ci, cv::Point pixel, cv::Vec3b colour)
cv::Vec< double, 5 > Vec5d
cv::Point find_local_minimum(const cv::Mat_< cv::Vec3b > &image, cv::Point center)
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
void generate_superpixels(const cv::Mat &image, int step, int nc)
void display_contours(cv::Mat &image, cv::Vec3b colour)
void init_data(const cv::Mat &image)
void colour_with_cluster_means(cv::Mat &image)
void display_center_grid(cv::Mat &image, cv::Scalar colour)
cv::Mat_< double > distances