forked from hkc/cc-stuff
1
0
Fork 0

Compare commits

..

No commits in common. "5f95f895d245200c33b92ba8978b4ae30dec4657" and "c5af524dac5839e6db6bc2a92576d7f3b43e42c4" have entirely different histories.

1 changed files with 4 additions and 19 deletions

View File

@ -95,8 +95,6 @@ struct k_means_state {
float r, g, b;
} sums;
size_t count;
union color closest_present_item;
float closest_present_distance;
} *centroid_intermediate;
size_t item_count;
};
@ -677,20 +675,13 @@ struct palette *custom_palette_from(const struct palette *orig) {
struct k_means_state k_means_init(const struct image *image, struct palette *starting_palette) {
size_t item_count = image->w * image->h;
uint8_t cluster_count = starting_palette->count;
struct k_means_state state = {
.items = image,
.clusters = starting_palette,
.predicted_cluster = calloc(image->w, image->h),
.centroid_intermediate = calloc(cluster_count, sizeof(struct k_means_centroid_intermediate)),
.centroid_intermediate = calloc(item_count, sizeof(struct k_means_centroid_intermediate)),
.item_count = item_count,
};
if (state.centroid_intermediate) {
for (size_t i = 0; i < cluster_count; i++) {
state.centroid_intermediate[i].closest_present_item = starting_palette->colors[i];
state.centroid_intermediate[i].closest_present_distance = 1e20;
}
}
return state;
}
@ -705,16 +696,11 @@ bool k_means_iteration(struct k_means_state *state) {
int closest_cluster = 0;
float closest_distance = 1e20;
for (int cluster = 0; cluster < state->clusters->count; cluster++) {
union color item = state->items->pixels[i];
float dist = get_color_difference(state->clusters->colors[cluster], item);
float dist = get_color_difference(state->clusters->colors[cluster], state->items->pixels[i]);
if (dist <= closest_distance) {
closest_distance = dist;
closest_cluster = cluster;
}
if (dist <= state->centroid_intermediate[cluster].closest_present_distance) {
state->centroid_intermediate[cluster].closest_present_item = item;
state->centroid_intermediate[cluster].closest_present_distance = dist;
}
}
if (!changed) {
changed = state->predicted_cluster[i] != closest_cluster;
@ -744,10 +730,9 @@ bool k_means_iteration(struct k_means_state *state) {
state->clusters->colors[i] = centroid;
} else {
// No pixels are closest to this color
// Warp the centroid onto the closest item
state->clusters->colors[i] = intermediate.closest_present_item;
// TODO: wiggle the centroid?
}
state->centroid_intermediate[i] = (struct k_means_centroid_intermediate) { .sums = {0, 0, 0}, .count = 0, .closest_present_item = state->clusters->colors[i], .closest_present_distance = 1e20 };
state->centroid_intermediate[i] = (struct k_means_centroid_intermediate) { .sums = {0, 0, 0}, .count = 0 };
}
return changed;