feat(新功能): design print_painting.py 新增选区填充功能
fix(修复bug): docs(文档变更): refactor(重构): test(增加测试):
This commit is contained in:
@@ -15,6 +15,7 @@ class PrintPainting:
|
|||||||
single_print = result['print']['single']
|
single_print = result['print']['single']
|
||||||
overall_print = result['print']['overall']
|
overall_print = result['print']['overall']
|
||||||
element_print = result['print']['element']
|
element_print = result['print']['element']
|
||||||
|
partial_path = result['print']['partial']
|
||||||
result['single_image'] = None
|
result['single_image'] = None
|
||||||
result['print_image'] = None
|
result['print_image'] = None
|
||||||
# TODO 给result['pattern_image'] resize 到resize_scale的大小
|
# TODO 给result['pattern_image'] resize 到resize_scale的大小
|
||||||
@@ -262,6 +263,45 @@ class PrintPainting:
|
|||||||
temp_fg = np.expand_dims(result['mask'], axis=2).repeat(3, axis=2)
|
temp_fg = np.expand_dims(result['mask'], axis=2).repeat(3, axis=2)
|
||||||
tmp2 = (result['final_image'] * (temp_fg / 255)).astype(np.uint8)
|
tmp2 = (result['final_image'] * (temp_fg / 255)).astype(np.uint8)
|
||||||
result['single_image'] = cv2.add(tmp1, tmp2)
|
result['single_image'] = cv2.add(tmp1, tmp2)
|
||||||
|
|
||||||
|
if partial_path:
|
||||||
|
print_background = np.zeros((result['pattern_image'].shape[0], result['pattern_image'].shape[1], 3), dtype=np.uint8)
|
||||||
|
mask_background = np.zeros((result['pattern_image'].shape[0], result['pattern_image'].shape[1], 3), dtype=np.uint8)
|
||||||
|
image, image_mode = self.read_image(partial_path)
|
||||||
|
if image_mode == "RGBA":
|
||||||
|
new_size = (result['pattern_image'].shape[1], result['pattern_image'].shape[0])
|
||||||
|
|
||||||
|
mask = image.split()[3]
|
||||||
|
resized_source = image.resize(new_size)
|
||||||
|
resized_source_mask = mask.resize(new_size)
|
||||||
|
|
||||||
|
# rotated_resized_source = resized_source.rotate(-partial_print['print_angle_list'][i])
|
||||||
|
# rotated_resized_source_mask = resized_source_mask.rotate(-partial_print['print_angle_list'][i])
|
||||||
|
|
||||||
|
source_image_pil = Image.fromarray(cv2.cvtColor(print_background, cv2.COLOR_BGR2RGB))
|
||||||
|
source_image_pil_mask = Image.fromarray(cv2.cvtColor(mask_background, cv2.COLOR_BGR2RGB))
|
||||||
|
|
||||||
|
source_image_pil.paste(resized_source, (0, 0), resized_source)
|
||||||
|
source_image_pil_mask.paste(resized_source_mask, (0, 0), resized_source_mask)
|
||||||
|
|
||||||
|
print_background = cv2.cvtColor(np.array(source_image_pil), cv2.COLOR_RGBA2BGR)
|
||||||
|
mask_background = cv2.cvtColor(np.array(source_image_pil_mask), cv2.COLOR_RGBA2BGR)
|
||||||
|
ret, mask_background = cv2.threshold(mask_background, 124, 255, cv2.THRESH_BINARY)
|
||||||
|
print_mask = cv2.bitwise_and(result['mask'], cv2.cvtColor(mask_background, cv2.COLOR_BGR2GRAY))
|
||||||
|
img_fg = cv2.bitwise_or(print_background, print_background, mask=print_mask)
|
||||||
|
# TODO element 丢失信息
|
||||||
|
three_channel_image = cv2.merge([cv2.bitwise_not(print_mask), cv2.bitwise_not(print_mask), cv2.bitwise_not(print_mask)])
|
||||||
|
img_bg = cv2.bitwise_and(result['final_image'], three_channel_image)
|
||||||
|
# mask_mo = np.expand_dims(print_mask, axis=2).repeat(3, axis=2)
|
||||||
|
# gray_mo = np.expand_dims(result['gray'], axis=2).repeat(3, axis=2)
|
||||||
|
# img_fg = (img_fg * (mask_mo / 255) * (gray_mo / 255)).astype(np.uint8)
|
||||||
|
result['final_image'] = cv2.add(img_bg, img_fg)
|
||||||
|
canvas = np.full_like(result['final_image'], 255)
|
||||||
|
temp_bg = np.expand_dims(cv2.bitwise_not(result['mask']), axis=2).repeat(3, axis=2)
|
||||||
|
tmp1 = (canvas * (temp_bg / 255)).astype(np.uint8)
|
||||||
|
temp_fg = np.expand_dims(result['mask'], axis=2).repeat(3, axis=2)
|
||||||
|
tmp2 = (result['final_image'] * (temp_fg / 255)).astype(np.uint8)
|
||||||
|
result['single_image'] = cv2.add(tmp1, tmp2)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -414,7 +454,6 @@ class PrintPainting:
|
|||||||
# y_offset = int(location[0][0])
|
# y_offset = int(location[0][0])
|
||||||
# x_offset = int(location[0][1])
|
# x_offset = int(location[0][1])
|
||||||
|
|
||||||
|
|
||||||
if len(image.shape) == 2:
|
if len(image.shape) == 2:
|
||||||
image = image[x_offset: x_offset + image_size_h, y_offset: y_offset + image_size_w]
|
image = image[x_offset: x_offset + image_size_h, y_offset: y_offset + image_size_w]
|
||||||
elif len(image.shape) == 3:
|
elif len(image.shape) == 3:
|
||||||
|
|||||||
Reference in New Issue
Block a user