mirror of
https://github.com/KrisKennaway/ii-pix.git
synced 2024-06-03 05:29:32 +00:00
Refactor
This commit is contained in:
parent
0323b80e68
commit
c78f731cd7
81
convert.py
81
convert.py
|
@ -96,36 +96,8 @@ class ClusterPalette:
|
||||||
self._image_rgb, new_palettes_cam, new_palettes_linear_rgb,
|
self._image_rgb, new_palettes_cam, new_palettes_linear_rgb,
|
||||||
self._rgb24_to_cam16ucs, float(penalty))
|
self._rgb24_to_cam16ucs, float(penalty))
|
||||||
|
|
||||||
# print(total_image_error, new_total_image_error,
|
self._reassign_unused_palettes(new_line_to_palette,
|
||||||
# self._palette_splits)
|
last_good_splits)
|
||||||
|
|
||||||
# TODO: extract this into a function
|
|
||||||
palettes_used = [False] * 16
|
|
||||||
for palette in new_line_to_palette:
|
|
||||||
palettes_used[palette] = True
|
|
||||||
for palette_idx, palette_used in enumerate(palettes_used):
|
|
||||||
if palette_used:
|
|
||||||
continue
|
|
||||||
print("Reassigning palette %d" % palette_idx)
|
|
||||||
max_width = 0
|
|
||||||
split_palette_idx = -1
|
|
||||||
idx = 0
|
|
||||||
for lower, upper in last_good_splits:
|
|
||||||
width = upper - lower
|
|
||||||
if width > max_width:
|
|
||||||
split_palette_idx = idx
|
|
||||||
idx += 1
|
|
||||||
|
|
||||||
lower, upper = last_good_splits[split_palette_idx]
|
|
||||||
if upper - lower > 20:
|
|
||||||
mid = (lower + upper) // 2
|
|
||||||
self._palette_splits[split_palette_idx] = (
|
|
||||||
lower, mid - 1)
|
|
||||||
self._palette_splits[palette_idx] = (mid, upper)
|
|
||||||
else:
|
|
||||||
lower = np.random.randint(0, 199)
|
|
||||||
upper = np.random.randint(lower, 200)
|
|
||||||
self._palette_splits[palette_idx] = (lower, upper)
|
|
||||||
|
|
||||||
if new_total_image_error >= total_image_error:
|
if new_total_image_error >= total_image_error:
|
||||||
iterations_since_improvement += 1
|
iterations_since_improvement += 1
|
||||||
|
@ -135,8 +107,11 @@ class ClusterPalette:
|
||||||
iterations_since_improvement = 0
|
iterations_since_improvement = 0
|
||||||
last_good_splits = self._palette_splits
|
last_good_splits = self._palette_splits
|
||||||
total_image_error = new_total_image_error
|
total_image_error = new_total_image_error
|
||||||
self._accept_palettes(
|
|
||||||
new_palettes_cam, new_palettes_rgb12_iigs, new_palette_errors)
|
self._palettes_cam = new_palettes_cam
|
||||||
|
self._palettes_rgb = new_palettes_rgb12_iigs
|
||||||
|
self._errors = new_palette_errors
|
||||||
|
self._palettes_accepted = True
|
||||||
|
|
||||||
yield (new_total_image_error, new_output_4bit, new_line_to_palette,
|
yield (new_total_image_error, new_output_4bit, new_line_to_palette,
|
||||||
new_palettes_rgb12_iigs, new_palettes_linear_rgb)
|
new_palettes_rgb12_iigs, new_palettes_linear_rgb)
|
||||||
|
@ -236,6 +211,34 @@ class ClusterPalette:
|
||||||
self._apply_palette_delta(palette_to_mutate, palette_lower_delta,
|
self._apply_palette_delta(palette_to_mutate, palette_lower_delta,
|
||||||
palette_upper_delta)
|
palette_upper_delta)
|
||||||
|
|
||||||
|
def _reassign_unused_palettes(self, new_line_to_palette, last_good_splits):
|
||||||
|
palettes_used = [False] * 16
|
||||||
|
for palette in new_line_to_palette:
|
||||||
|
palettes_used[palette] = True
|
||||||
|
for palette_idx, palette_used in enumerate(palettes_used):
|
||||||
|
if palette_used:
|
||||||
|
continue
|
||||||
|
print("Reassigning palette %d" % palette_idx)
|
||||||
|
max_width = 0
|
||||||
|
split_palette_idx = -1
|
||||||
|
idx = 0
|
||||||
|
for lower, upper in last_good_splits:
|
||||||
|
width = upper - lower
|
||||||
|
if width > max_width:
|
||||||
|
split_palette_idx = idx
|
||||||
|
idx += 1
|
||||||
|
|
||||||
|
lower, upper = last_good_splits[split_palette_idx]
|
||||||
|
if upper - lower > 20:
|
||||||
|
mid = (lower + upper) // 2
|
||||||
|
self._palette_splits[split_palette_idx] = (
|
||||||
|
lower, mid - 1)
|
||||||
|
self._palette_splits[palette_idx] = (mid, upper)
|
||||||
|
else:
|
||||||
|
lower = np.random.randint(0, 199)
|
||||||
|
upper = np.random.randint(lower, 200)
|
||||||
|
self._palette_splits[palette_idx] = (lower, upper)
|
||||||
|
|
||||||
def _propose_palettes(self) -> Tuple[np.ndarray, np.ndarray, List[float]]:
|
def _propose_palettes(self) -> Tuple[np.ndarray, np.ndarray, List[float]]:
|
||||||
"""Attempt to find new palettes that locally improve image quality.
|
"""Attempt to find new palettes that locally improve image quality.
|
||||||
|
|
||||||
|
@ -262,8 +265,6 @@ class ClusterPalette:
|
||||||
# individual palettes
|
# individual palettes
|
||||||
self._fit_global_palette()
|
self._fit_global_palette()
|
||||||
|
|
||||||
dynamic_colours = 16 - self._reserved_colours
|
|
||||||
|
|
||||||
self._mutate_palette_splits()
|
self._mutate_palette_splits()
|
||||||
for palette_idx in range(16):
|
for palette_idx in range(16):
|
||||||
palette_lower, palette_upper = self._palette_splits[palette_idx]
|
palette_lower, palette_upper = self._palette_splits[palette_idx]
|
||||||
|
@ -299,14 +300,6 @@ class ClusterPalette:
|
||||||
self._palettes_accepted = False
|
self._palettes_accepted = False
|
||||||
return new_palettes_cam, new_palettes_rgb12_iigs, new_errors
|
return new_palettes_cam, new_palettes_rgb12_iigs, new_errors
|
||||||
|
|
||||||
def _accept_palettes(
|
|
||||||
self, new_palettes_cam: np.ndarray,
|
|
||||||
new_palettes_rgb: np.ndarray, new_errors: List[float]):
|
|
||||||
self._palettes_cam = np.copy(new_palettes_cam)
|
|
||||||
self._palettes_rgb = np.copy(new_palettes_rgb)
|
|
||||||
self._errors = list(new_errors)
|
|
||||||
self._palettes_accepted = True
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
|
@ -370,7 +363,7 @@ def main():
|
||||||
|
|
||||||
# TODO: flags
|
# TODO: flags
|
||||||
penalty = 1 # 1e18 # TODO: is this needed any more?
|
penalty = 1 # 1e18 # TODO: is this needed any more?
|
||||||
iterations = 20# 0
|
iterations = 200
|
||||||
|
|
||||||
pygame.init()
|
pygame.init()
|
||||||
# TODO: for some reason I need to execute this twice - the first time
|
# TODO: for some reason I need to execute this twice - the first time
|
||||||
|
@ -389,7 +382,7 @@ def main():
|
||||||
|
|
||||||
for (new_total_image_error, output_4bit, line_to_palette,
|
for (new_total_image_error, output_4bit, line_to_palette,
|
||||||
palettes_rgb12_iigs, palettes_linear_rgb) in cluster_palette.iterate(
|
palettes_rgb12_iigs, palettes_linear_rgb) in cluster_palette.iterate(
|
||||||
penalty, iterations):
|
penalty, iterations):
|
||||||
|
|
||||||
if total_image_error is not None:
|
if total_image_error is not None:
|
||||||
print("Improved quality +%f%% (%f)" % (
|
print("Improved quality +%f%% (%f)" % (
|
||||||
|
|
Loading…
Reference in New Issue
Block a user