Source code for pierogis.ingredients.recipe
import numpy as np
from .ingredient import Ingredient
[docs]class Recipe(Ingredient):
"""
ingredient used to coordinate cooking of several ingredients
when a recipe is cooked, its ingredients are cooked in order
"""
[docs] def prep(self, ingredients: list = None, **kwargs):
"""
provide a list of ingredients to cook in sequence
:param ingredients: list of Ingredient objects
"""
if ingredients is None:
ingredients = []
if isinstance(ingredients, list):
self.ingredients = ingredients
else:
raise TypeError("kwarg 'ingredients' must be of type list")
[docs] def cook(self, pixels: np.ndarray):
"""
sequentially cooks each ingredient
uses the pixels resulting from the previous cook
"""
# input array used to select the
under_pixels = pixels
for ingredient in self.ingredients:
# cook the lower layer
cooked_pixels = ingredient.cook(under_pixels)
mask = ingredient.mask_pixels(cooked_pixels)
binary_array = np.all(mask == self._white_pixel, axis=2)
# resize under array to cooked array
cooked_width = cooked_pixels.shape[0]
cooked_height = cooked_pixels.shape[1]
resized_pixels = np.resize(under_pixels, (cooked_width, cooked_height, 3))
masked_pixels = resized_pixels
# layer cooked pixels over uncooked for true pixels (white in mask)
masked_pixels[binary_array] = cooked_pixels[binary_array]
# mix them based on the overlaying opacity
mixed_pixels = (masked_pixels.astype(np.dtype(float))
* ingredient.opacity
+
resized_pixels.astype(np.dtype(float))
* (100 - ingredient.opacity)) / 100
# reset for loop
under_pixels = mixed_pixels.astype('uint8')
# keep in range
clipped_pixels = np.clip(under_pixels, 0, 255)
return clipped_pixels
[docs] def add(self, ingredient: Ingredient):
"""
Add an ingredient
"""
self.ingredients.append(ingredient)