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);
69 double dc =
sqrt(pow(cen[0] - colour[0], 2) + pow(cen[1]
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));
73 return sqrt(pow(
dc /
nc, 2) + pow(ds /
ns, 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);
105 if (
sqrt(pow(i1 - i3, 2)) +
sqrt(pow(i2 - i3,2)) < min_grad) {
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++) {
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;
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]);