Completely boneheaded move: removed the poorly-working color matching logic completely rather than waiting for the rewrite to replace. Restored that and added threading logic for running renders in parallel
This commit is contained in:
parent
9891be61a8
commit
1888bf9aba
|
@ -5,6 +5,7 @@ import cv2
|
||||||
from common import convert_color, closest_color_weighted_euclidean, closest_color_euclidean, create_colored_image, remove_from_list, list_match, to_luma, convertScale
|
from common import convert_color, closest_color_weighted_euclidean, closest_color_euclidean, create_colored_image, remove_from_list, list_match, to_luma, convertScale
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
|
from multiprocessing.pool import ThreadPool
|
||||||
from functools import cmp_to_key
|
from functools import cmp_to_key
|
||||||
|
|
||||||
def sort_pallete (a, b):
|
def sort_pallete (a, b):
|
||||||
|
@ -101,7 +102,28 @@ class Posterize:
|
||||||
'space' : self.pallete_space
|
'space' : self.pallete_space
|
||||||
})
|
})
|
||||||
|
|
||||||
|
for i in range(self.n_colors) :
|
||||||
|
if list_match(self.original_colors[i], white) :
|
||||||
|
continue
|
||||||
|
original = self.original_colors[i] #BGR
|
||||||
|
mask = self.extract_color_mask(self.image, original)
|
||||||
|
original_normalized = convert_color(original, 'BGR', self.pallete_space)
|
||||||
|
if self.pallete_space == 'RGB' or self.pallete_space == 'BGR' :
|
||||||
|
closest, dist = closest_color_weighted_euclidean(self.colors, original_normalized, self.pallete_space)
|
||||||
|
else :
|
||||||
|
closest, dist = closest_color_euclidean(self.colors, original_normalized)
|
||||||
|
self.colors = remove_from_list(self.colors, closest)
|
||||||
|
name = self.match_color_name(closest)
|
||||||
|
layer_name = f'{name}.png'
|
||||||
|
output_layer = os.path.join(self.output, layer_name)
|
||||||
|
cv2.imwrite(output_layer, mask)
|
||||||
|
self.layers.append({
|
||||||
|
'layer' : output_layer,
|
||||||
|
'color' : closest,
|
||||||
|
'space' : self.pallete_space
|
||||||
|
})
|
||||||
|
mask = cv2.bitwise_not(mask)
|
||||||
|
composite[mask > 0] = np.array(closest)
|
||||||
|
|
||||||
composite_name = f'posterized.png'
|
composite_name = f'posterized.png'
|
||||||
composite_path = os.path.join(self.output, composite_name)
|
composite_path = os.path.join(self.output, composite_name)
|
||||||
|
@ -131,6 +153,8 @@ class Posterize:
|
||||||
|
|
||||||
def stipple (self) :
|
def stipple (self) :
|
||||||
sanity_check = 0
|
sanity_check = 0
|
||||||
|
cmds = []
|
||||||
|
|
||||||
for layer in self.layers :
|
for layer in self.layers :
|
||||||
if 'WHITE.png' in layer['layer'] :
|
if 'WHITE.png' in layer['layer'] :
|
||||||
continue
|
continue
|
||||||
|
@ -154,12 +178,32 @@ class Posterize:
|
||||||
'--config', self.conf,
|
'--config', self.conf,
|
||||||
'--maxParticles', str(max_particles)
|
'--maxParticles', str(max_particles)
|
||||||
]
|
]
|
||||||
print(cmd)
|
cmds.append({
|
||||||
subprocess.call(cmd, cwd = self.stipple_gen)
|
'cmd' : cmd,
|
||||||
self.svgs.append(output_svg)
|
'color' : layer['color'],
|
||||||
|
'output_image' : output_image,
|
||||||
|
'output_svg' : output_svg
|
||||||
|
})
|
||||||
|
|
||||||
|
if self.jobs > 1 :
|
||||||
|
print(f'Running {self.jobs} processes simultaneously for {len(cmds)} jobs')
|
||||||
|
pool = ThreadPool(self.jobs)
|
||||||
|
for job in cmds :
|
||||||
|
pool.apply_async(self.render, (job,))
|
||||||
|
pool.close()
|
||||||
|
pool.join()
|
||||||
|
|
||||||
|
else :
|
||||||
|
for job in cmds :
|
||||||
|
self.render(job)
|
||||||
|
|
||||||
|
|
||||||
|
def render (self, job) :
|
||||||
|
subprocess.Popen(job['cmd'], cwd = self.stipple_gen)
|
||||||
|
self.svgs.append(job['output_svg'])
|
||||||
self.previews.append({
|
self.previews.append({
|
||||||
'layer' : output_image,
|
'layer' : job['output_image'],
|
||||||
'color' : layer['color']
|
'color' : job['color']
|
||||||
})
|
})
|
||||||
|
|
||||||
def preview (self) :
|
def preview (self) :
|
||||||
|
|
Loading…
Reference in New Issue