|
@@ -1,12 +1,16 @@
|
|
|
import os
|
|
import os
|
|
|
import copy
|
|
import copy
|
|
|
import time
|
|
import time
|
|
|
-from .image_deal_base_func import *
|
|
|
|
|
|
|
+from generate_main_image.image_deal_base_func import *
|
|
|
from PIL import Image, ImageDraw
|
|
from PIL import Image, ImageDraw
|
|
|
from blend_modes import multiply
|
|
from blend_modes import multiply
|
|
|
import os
|
|
import os
|
|
|
import settings
|
|
import settings
|
|
|
from functools import wraps
|
|
from functools import wraps
|
|
|
|
|
+from multi_threaded_image_saving import ImageSaver
|
|
|
|
|
+from get_mask_by_green import GetMask
|
|
|
|
|
+
|
|
|
|
|
+#
|
|
|
|
|
|
|
|
|
|
|
|
|
def time_it(func):
|
|
def time_it(func):
|
|
@@ -15,7 +19,9 @@ def time_it(func):
|
|
|
start_time = time.time() # 记录开始时间
|
|
start_time = time.time() # 记录开始时间
|
|
|
result = func(*args, **kwargs) # 调用原始函数
|
|
result = func(*args, **kwargs) # 调用原始函数
|
|
|
end_time = time.time() # 记录结束时间
|
|
end_time = time.time() # 记录结束时间
|
|
|
- print(f"Executing {func.__name__} took {end_time - start_time:.4f} seconds.") # 打印耗时
|
|
|
|
|
|
|
+ print(
|
|
|
|
|
+ f"Executing {func.__name__} took {end_time - start_time:.4f} seconds."
|
|
|
|
|
+ ) # 打印耗时
|
|
|
return result
|
|
return result
|
|
|
|
|
|
|
|
return wrapper
|
|
return wrapper
|
|
@@ -25,10 +31,11 @@ class GeneratePic(object):
|
|
|
def __init__(self, is_test=False):
|
|
def __init__(self, is_test=False):
|
|
|
# self.logger = MyLogger()
|
|
# self.logger = MyLogger()
|
|
|
self.is_test = is_test
|
|
self.is_test = is_test
|
|
|
|
|
+ self.saver = ImageSaver()
|
|
|
pass
|
|
pass
|
|
|
|
|
|
|
|
@time_it
|
|
@time_it
|
|
|
- def get_mask_and_config(self, im_jpg: Image, im_png: Image):
|
|
|
|
|
|
|
+ def get_mask_and_config(self, im_jpg: Image, im_png: Image, curve_mask: bool):
|
|
|
"""
|
|
"""
|
|
|
步骤:
|
|
步骤:
|
|
|
1、尺寸进行对应缩小
|
|
1、尺寸进行对应缩小
|
|
@@ -48,27 +55,67 @@ class GeneratePic(object):
|
|
|
# 在鞋底最低处增加一条直线蒙版,蒙版宽度为有效区域大小
|
|
# 在鞋底最低处增加一条直线蒙版,蒙版宽度为有效区域大小
|
|
|
image_high = im_jpg.height
|
|
image_high = im_jpg.height
|
|
|
print("图片高度:", image_high)
|
|
print("图片高度:", image_high)
|
|
|
|
|
+ # TODO 待移除
|
|
|
|
|
+ if settings.app:
|
|
|
|
|
+ settings.app.processEvents()
|
|
|
cv2_jpg = pil_to_cv2(im_jpg)
|
|
cv2_jpg = pil_to_cv2(im_jpg)
|
|
|
- # 返回线条图片,以及最低位置
|
|
|
|
|
- img_with_shifted_line, lowest_y = draw_shifted_line(image=cv2_jpg,
|
|
|
|
|
- min_y_values=min_y_values,
|
|
|
|
|
- shift_amount=15,
|
|
|
|
|
- one_line_pos=(x1, x2),
|
|
|
|
|
- line_color=(0, 0, 0),
|
|
|
|
|
- line_thickness=20)
|
|
|
|
|
|
|
|
|
|
|
|
+ # 返回线条图片,以及最低位置
|
|
|
|
|
+ print("返回线条图片,以及最低位置")
|
|
|
|
|
+ # crop_image_box=(x1, y1, x2, y2),
|
|
|
|
|
+ if curve_mask:
|
|
|
|
|
+ crop_image_box = None
|
|
|
|
|
+ else:
|
|
|
|
|
+ # 不需要曲线部分的蒙版
|
|
|
|
|
+ crop_image_box = (x1, y1, x2, y2)
|
|
|
|
|
+ img_with_shifted_line, lowest_y = draw_shifted_line(
|
|
|
|
|
+ image=cv2_jpg,
|
|
|
|
|
+ min_y_values=min_y_values,
|
|
|
|
|
+ shift_amount=15,
|
|
|
|
|
+ one_line_pos=(x1, x2),
|
|
|
|
|
+ line_color=(0, 0, 0),
|
|
|
|
|
+ line_thickness=20,
|
|
|
|
|
+ app=settings.app,
|
|
|
|
|
+ crop_image_box=crop_image_box,
|
|
|
|
|
+ )
|
|
|
|
|
+ # TODO 待移除
|
|
|
|
|
+ if settings.app:
|
|
|
|
|
+ settings.app.processEvents()
|
|
|
|
|
+ print("66 制作蒙版")
|
|
|
# 制作蒙版
|
|
# 制作蒙版
|
|
|
mask_line = cv2_to_pil(img_with_shifted_line)
|
|
mask_line = cv2_to_pil(img_with_shifted_line)
|
|
|
- mask = mask_line.convert('L') # 转换为灰度图
|
|
|
|
|
|
|
+ mask = mask_line.convert("L") # 转换为灰度图
|
|
|
mask = ImageOps.invert(mask)
|
|
mask = ImageOps.invert(mask)
|
|
|
# 蒙版扩边
|
|
# 蒙版扩边
|
|
|
- mask = expand_mask(mask, expansion_radius=30, blur_radius=10)
|
|
|
|
|
-
|
|
|
|
|
|
|
+ print("72 蒙版扩边")
|
|
|
|
|
+ # 默认expansion_radius 65 blur_radius 45
|
|
|
|
|
+ mask = expand_or_shrink_mask(
|
|
|
|
|
+ pil_image=mask, expansion_radius=50, blur_radius=35
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ # =============使用绿色蒙版进行处理
|
|
|
|
|
+ if settings.IS_GET_GREEN_MASK:
|
|
|
|
|
+ print("============使用绿色蒙版进行处理")
|
|
|
|
|
+ mask = mask.convert("RGB")
|
|
|
|
|
+ white_bg = Image.new(mode="RGB", size=im_png.size, color=(0, 0, 0))
|
|
|
|
|
+ green_areas_mask_pil = GetMask().find_green_areas(cv2_jpg)
|
|
|
|
|
+ green_areas_mask_pil = expand_or_shrink_mask(
|
|
|
|
|
+ pil_image=green_areas_mask_pil, expansion_radius=15, blur_radius=5
|
|
|
|
|
+ )
|
|
|
|
|
+ mask.paste(white_bg, mask=green_areas_mask_pil.convert("L"))
|
|
|
|
|
+ mask = mask.convert("L")
|
|
|
|
|
+
|
|
|
|
|
+ # TODO 待移除
|
|
|
|
|
+ if settings.app:
|
|
|
|
|
+ settings.app.processEvents()
|
|
|
# ====================生成新的图片
|
|
# ====================生成新的图片
|
|
|
|
|
+ print("84 生成新的图片")
|
|
|
bg = Image.new(mode="RGBA", size=im_png.size, color=(255, 255, 255, 255))
|
|
bg = Image.new(mode="RGBA", size=im_png.size, color=(255, 255, 255, 255))
|
|
|
bg.paste(im_png, mask=im_png)
|
|
bg.paste(im_png, mask=im_png)
|
|
|
bg.paste(im_jpg, mask=mask) # 粘贴有阴影的地方
|
|
bg.paste(im_jpg, mask=mask) # 粘贴有阴影的地方
|
|
|
-
|
|
|
|
|
|
|
+ # TODO 待移除
|
|
|
|
|
+ if settings.app:
|
|
|
|
|
+ settings.app.processEvents()
|
|
|
if self.is_test:
|
|
if self.is_test:
|
|
|
_bg = bg.copy()
|
|
_bg = bg.copy()
|
|
|
draw = ImageDraw.Draw(_bg)
|
|
draw = ImageDraw.Draw(_bg)
|
|
@@ -77,16 +124,12 @@ class GeneratePic(object):
|
|
|
end_point = (_bg.width, lowest_y) # 直线的结束点
|
|
end_point = (_bg.width, lowest_y) # 直线的结束点
|
|
|
# 定义直线的颜色(R, G, B)
|
|
# 定义直线的颜色(R, G, B)
|
|
|
line_color = (255, 0, 0) # 红色
|
|
line_color = (255, 0, 0) # 红色
|
|
|
|
|
+ _r = Image.new(mode="RGBA", size=im_png.size, color=(246, 147, 100, 255))
|
|
|
|
|
+ # mask_line = mask_line.convert('L') # 转换为灰度图
|
|
|
|
|
+ # mask_line = ImageOps.invert(mask_line)
|
|
|
|
|
+ # _bg.paste(_r, mask=mask)
|
|
|
# 绘制直线
|
|
# 绘制直线
|
|
|
draw.line([start_point, end_point], fill=line_color, width=1)
|
|
draw.line([start_point, end_point], fill=line_color, width=1)
|
|
|
- # mask.show()
|
|
|
|
|
- # bg = pil_to_cv2(bg)
|
|
|
|
|
- # cv2.line(bg, (x1, lowest_y + 5), (x2, lowest_y + 5), color=(0, 0, 0),thickness=2)
|
|
|
|
|
- # bg = cv2_to_pil(bg)
|
|
|
|
|
- _r = Image.new(mode="RGBA", size=im_png.size, color=(246, 147, 100, 255))
|
|
|
|
|
- mask_line = mask_line.convert('L') # 转换为灰度图
|
|
|
|
|
- mask_line = ImageOps.invert(mask_line)
|
|
|
|
|
- _bg.paste(_r, mask=mask)
|
|
|
|
|
_bg.show()
|
|
_bg.show()
|
|
|
|
|
|
|
|
# bg.save(r"C:\Users\gymmc\Desktop\data\bg.png")
|
|
# bg.save(r"C:\Users\gymmc\Desktop\data\bg.png")
|
|
@@ -103,25 +146,42 @@ class GeneratePic(object):
|
|
|
print("image_high lowest_y", image_high, lowest_y)
|
|
print("image_high lowest_y", image_high, lowest_y)
|
|
|
rows = [lowest_y] # 需要检查的像素行
|
|
rows = [lowest_y] # 需要检查的像素行
|
|
|
|
|
|
|
|
|
|
+ print("copy.copy(im_shadow)")
|
|
|
_im_shadow = copy.copy(im_shadow)
|
|
_im_shadow = copy.copy(im_shadow)
|
|
|
Midtones = 0.7
|
|
Midtones = 0.7
|
|
|
Highlight = 235
|
|
Highlight = 235
|
|
|
- k = 8
|
|
|
|
|
|
|
+ k = copy.copy(settings.COLOR_GRADATION_CYCLES)
|
|
|
|
|
+ print("循环识别")
|
|
|
|
|
+ xunhuan = 0
|
|
|
while k:
|
|
while k:
|
|
|
|
|
+ xunhuan += 1
|
|
|
|
|
+ if settings.app:
|
|
|
|
|
+ settings.app.processEvents()
|
|
|
k -= 1
|
|
k -= 1
|
|
|
- Midtones += 0.1
|
|
|
|
|
- if Midtones > 1:
|
|
|
|
|
- Midtones = 1
|
|
|
|
|
|
|
+ Midtones += 0.035
|
|
|
|
|
+ if Midtones > 1.7:
|
|
|
|
|
+ Midtones = 1.7
|
|
|
Highlight -= 3
|
|
Highlight -= 3
|
|
|
- _im_shadow = levels_adjust(img=im_shadow, Shadow=0, Midtones=Midtones, Highlight=Highlight,
|
|
|
|
|
- OutShadow=0,
|
|
|
|
|
- OutHighlight=255, Dim=3)
|
|
|
|
|
- brightness_list = calculate_average_brightness_opencv(img_gray=_im_shadow, rows_to_check=rows)
|
|
|
|
|
- print(brightness_list)
|
|
|
|
|
|
|
|
|
|
|
|
+ _im_shadow = levels_adjust(
|
|
|
|
|
+ img=im_shadow,
|
|
|
|
|
+ Shadow=0,
|
|
|
|
|
+ Midtones=Midtones,
|
|
|
|
|
+ Highlight=Highlight,
|
|
|
|
|
+ OutShadow=0,
|
|
|
|
|
+ OutHighlight=255,
|
|
|
|
|
+ Dim=3,
|
|
|
|
|
+ )
|
|
|
|
|
+ brightness_list = calculate_average_brightness_opencv(
|
|
|
|
|
+ img_gray=_im_shadow, rows_to_check=rows
|
|
|
|
|
+ )
|
|
|
|
|
+ print(
|
|
|
|
|
+ "循环识别:{},Midtones:{},Highlight:{},brightness_list:{}".format(
|
|
|
|
|
+ xunhuan, Midtones, Highlight, brightness_list
|
|
|
|
|
+ )
|
|
|
|
|
+ )
|
|
|
if brightness_list[0] >= settings.GRENERATE_MAIN_PIC_BRIGHTNESS:
|
|
if brightness_list[0] >= settings.GRENERATE_MAIN_PIC_BRIGHTNESS:
|
|
|
break
|
|
break
|
|
|
- print("Midtones,Highlight:", Midtones, Highlight)
|
|
|
|
|
|
|
|
|
|
im_shadow = cv2_to_pil(_im_shadow)
|
|
im_shadow = cv2_to_pil(_im_shadow)
|
|
|
|
|
|
|
@@ -130,8 +190,12 @@ class GeneratePic(object):
|
|
|
|
|
|
|
|
# 1、图片预处理,只保留阴影
|
|
# 1、图片预处理,只保留阴影
|
|
|
only_shadow_img = im_shadow.copy()
|
|
only_shadow_img = im_shadow.copy()
|
|
|
- only_shadow_img.paste(Image.new(mode="RGBA", size=only_shadow_img.size, color=(255, 255, 255, 255)),
|
|
|
|
|
- mask=im_png)
|
|
|
|
|
|
|
+ only_shadow_img.paste(
|
|
|
|
|
+ Image.new(
|
|
|
|
|
+ mode="RGBA", size=only_shadow_img.size, color=(255, 255, 255, 255)
|
|
|
|
|
+ ),
|
|
|
|
|
+ mask=im_png,
|
|
|
|
|
+ )
|
|
|
average_brightness = calculated_shadow_brightness(only_shadow_img)
|
|
average_brightness = calculated_shadow_brightness(only_shadow_img)
|
|
|
print("average_brightness:", average_brightness)
|
|
print("average_brightness:", average_brightness)
|
|
|
|
|
|
|
@@ -143,7 +207,7 @@ class GeneratePic(object):
|
|
|
|
|
|
|
|
return mask, config
|
|
return mask, config
|
|
|
|
|
|
|
|
- def get_mask_and_config_beifen(self, im_jpg: Image, im_png: Image, out_image_path=None):
|
|
|
|
|
|
|
+ def get_mask_and_config_1_2025_05_18(self, im_jpg: Image, im_png: Image):
|
|
|
"""
|
|
"""
|
|
|
步骤:
|
|
步骤:
|
|
|
1、尺寸进行对应缩小
|
|
1、尺寸进行对应缩小
|
|
@@ -151,9 +215,7 @@ class GeneratePic(object):
|
|
|
3、自动色阶检查亮度
|
|
3、自动色阶检查亮度
|
|
|
4、输出自动色阶参数、以及放大的尺寸蒙版
|
|
4、输出自动色阶参数、以及放大的尺寸蒙版
|
|
|
"""
|
|
"""
|
|
|
- # ===================尺寸进行对应缩小
|
|
|
|
|
- orign_x, orign_y = im_jpg.size
|
|
|
|
|
-
|
|
|
|
|
|
|
+ # ===================尺寸进行对应缩小(提升处理速度)
|
|
|
im_jpg = to_resize(im_jpg, width=800)
|
|
im_jpg = to_resize(im_jpg, width=800)
|
|
|
im_png = to_resize(im_png, width=800)
|
|
im_png = to_resize(im_png, width=800)
|
|
|
x1, y1, x2, y2 = im_png.getbbox()
|
|
x1, y1, x2, y2 = im_png.getbbox()
|
|
@@ -163,31 +225,75 @@ class GeneratePic(object):
|
|
|
# 查找每列的最低非透明点
|
|
# 查找每列的最低非透明点
|
|
|
min_y_values = find_lowest_non_transparent_points(cv2_png)
|
|
min_y_values = find_lowest_non_transparent_points(cv2_png)
|
|
|
# 在鞋底最低处增加一条直线蒙版,蒙版宽度为有效区域大小
|
|
# 在鞋底最低处增加一条直线蒙版,蒙版宽度为有效区域大小
|
|
|
|
|
+ image_high = im_jpg.height
|
|
|
|
|
+ print("图片高度:", image_high)
|
|
|
|
|
+ # TODO 待移除
|
|
|
|
|
+ if settings.app:
|
|
|
|
|
+ settings.app.processEvents()
|
|
|
cv2_jpg = pil_to_cv2(im_jpg)
|
|
cv2_jpg = pil_to_cv2(im_jpg)
|
|
|
# 返回线条图片,以及最低位置
|
|
# 返回线条图片,以及最低位置
|
|
|
- img_with_shifted_line, lowest_y = draw_shifted_line(image=cv2_jpg,
|
|
|
|
|
- min_y_values=min_y_values,
|
|
|
|
|
- shift_amount=15,
|
|
|
|
|
- one_line_pos=(x1, x2),
|
|
|
|
|
- line_color=(0, 0, 0),
|
|
|
|
|
- line_thickness=20)
|
|
|
|
|
-
|
|
|
|
|
|
|
+ print("返回线条图片,以及最低位置")
|
|
|
|
|
+ img_with_shifted_line, lowest_y = draw_shifted_line(
|
|
|
|
|
+ image=cv2_jpg,
|
|
|
|
|
+ min_y_values=min_y_values,
|
|
|
|
|
+ shift_amount=15,
|
|
|
|
|
+ one_line_pos=(x1, x2),
|
|
|
|
|
+ line_color=(0, 0, 0),
|
|
|
|
|
+ line_thickness=20,
|
|
|
|
|
+ app=settings.app,
|
|
|
|
|
+ crop_image_box=(x1, y1, x2, y2),
|
|
|
|
|
+ )
|
|
|
|
|
+ # TODO 待移除
|
|
|
|
|
+ if settings.app:
|
|
|
|
|
+ settings.app.processEvents()
|
|
|
|
|
+ print("66 制作蒙版")
|
|
|
# 制作蒙版
|
|
# 制作蒙版
|
|
|
- mask = cv2_to_pil(img_with_shifted_line)
|
|
|
|
|
- mask = mask.convert('L') # 转换为灰度图
|
|
|
|
|
|
|
+ mask_line = cv2_to_pil(img_with_shifted_line)
|
|
|
|
|
+ mask = mask_line.convert("L") # 转换为灰度图
|
|
|
mask = ImageOps.invert(mask)
|
|
mask = ImageOps.invert(mask)
|
|
|
# 蒙版扩边
|
|
# 蒙版扩边
|
|
|
- mask = expand_mask(mask, expansion_radius=30, blur_radius=10)
|
|
|
|
|
-
|
|
|
|
|
|
|
+ print("72 蒙版扩边")
|
|
|
|
|
+ # 默认expansion_radius 65 blur_radius 45
|
|
|
|
|
+ mask = expand_or_shrink_mask(
|
|
|
|
|
+ pil_image=mask, expansion_radius=50, blur_radius=35
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ # mask1 = expand_mask(mask, expansion_radius=30, blur_radius=10)
|
|
|
|
|
+ # mask1.save("mask1.png")
|
|
|
|
|
+ # mask2 = expand_or_shrink_mask(pil_image=mask, expansion_radius=60, blur_radius=30)
|
|
|
|
|
+ # mask2.save("mask2.png")
|
|
|
|
|
+ # raise 11
|
|
|
|
|
+
|
|
|
|
|
+ # TODO 待移除
|
|
|
|
|
+ if settings.app:
|
|
|
|
|
+ settings.app.processEvents()
|
|
|
# ====================生成新的图片
|
|
# ====================生成新的图片
|
|
|
|
|
+ print("84 生成新的图片")
|
|
|
bg = Image.new(mode="RGBA", size=im_png.size, color=(255, 255, 255, 255))
|
|
bg = Image.new(mode="RGBA", size=im_png.size, color=(255, 255, 255, 255))
|
|
|
bg.paste(im_png, mask=im_png)
|
|
bg.paste(im_png, mask=im_png)
|
|
|
bg.paste(im_jpg, mask=mask) # 粘贴有阴影的地方
|
|
bg.paste(im_jpg, mask=mask) # 粘贴有阴影的地方
|
|
|
-
|
|
|
|
|
- # bg = pil_to_cv2(bg)
|
|
|
|
|
- # cv2.line(bg, (x1, lowest_y + 5), (x2, lowest_y + 5), color=(0, 0, 0),thickness=2)
|
|
|
|
|
- # bg = cv2_to_pil(bg)
|
|
|
|
|
- # bg.show()
|
|
|
|
|
|
|
+ # TODO 待移除
|
|
|
|
|
+ if settings.app:
|
|
|
|
|
+ settings.app.processEvents()
|
|
|
|
|
+ if self.is_test:
|
|
|
|
|
+ _bg = bg.copy()
|
|
|
|
|
+ draw = ImageDraw.Draw(_bg)
|
|
|
|
|
+ # 定义直线的起点和终点坐标
|
|
|
|
|
+ start_point = (0, lowest_y) # 直线的起始点
|
|
|
|
|
+ end_point = (_bg.width, lowest_y) # 直线的结束点
|
|
|
|
|
+ # 定义直线的颜色(R, G, B)
|
|
|
|
|
+ line_color = (255, 0, 0) # 红色
|
|
|
|
|
+ # 绘制直线
|
|
|
|
|
+ draw.line([start_point, end_point], fill=line_color, width=1)
|
|
|
|
|
+ # mask.show()
|
|
|
|
|
+ # bg = pil_to_cv2(bg)
|
|
|
|
|
+ # cv2.line(bg, (x1, lowest_y + 5), (x2, lowest_y + 5), color=(0, 0, 0),thickness=2)
|
|
|
|
|
+ # bg = cv2_to_pil(bg)
|
|
|
|
|
+ _r = Image.new(mode="RGBA", size=im_png.size, color=(246, 147, 100, 255))
|
|
|
|
|
+ mask_line = mask_line.convert("L") # 转换为灰度图
|
|
|
|
|
+ mask_line = ImageOps.invert(mask_line)
|
|
|
|
|
+ _bg.paste(_r, mask=mask)
|
|
|
|
|
+ _bg.show()
|
|
|
|
|
|
|
|
# bg.save(r"C:\Users\gymmc\Desktop\data\bg.png")
|
|
# bg.save(r"C:\Users\gymmc\Desktop\data\bg.png")
|
|
|
# bg.show()
|
|
# bg.show()
|
|
@@ -197,35 +303,69 @@ class GeneratePic(object):
|
|
|
_im = cv2.cvtColor(np.asarray(bg), cv2.COLOR_RGB2BGR)
|
|
_im = cv2.cvtColor(np.asarray(bg), cv2.COLOR_RGB2BGR)
|
|
|
# 背景阴影
|
|
# 背景阴影
|
|
|
im_shadow = cv2.cvtColor(_im, cv2.COLOR_BGR2GRAY)
|
|
im_shadow = cv2.cvtColor(_im, cv2.COLOR_BGR2GRAY)
|
|
|
-
|
|
|
|
|
|
|
+ print("image_high lowest_y", image_high, lowest_y)
|
|
|
|
|
+ if lowest_y < 0 or lowest_y >= image_high:
|
|
|
|
|
+ lowest_y = image_high - 1
|
|
|
|
|
+ print("image_high lowest_y", image_high, lowest_y)
|
|
|
rows = [lowest_y] # 需要检查的像素行
|
|
rows = [lowest_y] # 需要检查的像素行
|
|
|
|
|
+
|
|
|
|
|
+ print("copy.copy(im_shadow)")
|
|
|
_im_shadow = copy.copy(im_shadow)
|
|
_im_shadow = copy.copy(im_shadow)
|
|
|
- Midtones = 0.62
|
|
|
|
|
|
|
+ Midtones = 0.7
|
|
|
Highlight = 235
|
|
Highlight = 235
|
|
|
- k = 10
|
|
|
|
|
|
|
+ k = 12
|
|
|
|
|
+ print("循环识别")
|
|
|
while k:
|
|
while k:
|
|
|
|
|
+ print("循环识别:{}".format(k))
|
|
|
|
|
+ if settings.app:
|
|
|
|
|
+ settings.app.processEvents()
|
|
|
k -= 1
|
|
k -= 1
|
|
|
Midtones += 0.1
|
|
Midtones += 0.1
|
|
|
if Midtones > 1:
|
|
if Midtones > 1:
|
|
|
Midtones = 1
|
|
Midtones = 1
|
|
|
Highlight -= 3
|
|
Highlight -= 3
|
|
|
- _im_shadow = levels_adjust(img=im_shadow, Shadow=0, Midtones=Midtones, Highlight=Highlight,
|
|
|
|
|
- OutShadow=0,
|
|
|
|
|
- OutHighlight=255, Dim=3)
|
|
|
|
|
- brightness_list = calculate_average_brightness_opencv(img_gray=_im_shadow, rows_to_check=rows)
|
|
|
|
|
|
|
+ _im_shadow = levels_adjust(
|
|
|
|
|
+ img=im_shadow,
|
|
|
|
|
+ Shadow=0,
|
|
|
|
|
+ Midtones=Midtones,
|
|
|
|
|
+ Highlight=Highlight,
|
|
|
|
|
+ OutShadow=0,
|
|
|
|
|
+ OutHighlight=255,
|
|
|
|
|
+ Dim=3,
|
|
|
|
|
+ )
|
|
|
|
|
+ brightness_list = calculate_average_brightness_opencv(
|
|
|
|
|
+ img_gray=_im_shadow, rows_to_check=rows
|
|
|
|
|
+ )
|
|
|
print(brightness_list)
|
|
print(brightness_list)
|
|
|
- if brightness_list[0] >= 254:
|
|
|
|
|
|
|
+ if brightness_list[0] >= settings.GRENERATE_MAIN_PIC_BRIGHTNESS:
|
|
|
break
|
|
break
|
|
|
print("Midtones,Highlight:", Midtones, Highlight)
|
|
print("Midtones,Highlight:", Midtones, Highlight)
|
|
|
- config = (Midtones, Highlight)
|
|
|
|
|
|
|
+
|
|
|
im_shadow = cv2_to_pil(_im_shadow)
|
|
im_shadow = cv2_to_pil(_im_shadow)
|
|
|
- im_shadow.paste(im_png, (0, 0), im_png) # 把原图粘贴回去,避免色差
|
|
|
|
|
- if out_image_path:
|
|
|
|
|
- im_shadow.save(out_image_path)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ # ========================================================
|
|
|
|
|
+ # 计算阴影的亮度,用于确保阴影不要太黑
|
|
|
|
|
+
|
|
|
|
|
+ # 1、图片预处理,只保留阴影
|
|
|
|
|
+ only_shadow_img = im_shadow.copy()
|
|
|
|
|
+ only_shadow_img.paste(
|
|
|
|
|
+ Image.new(
|
|
|
|
|
+ mode="RGBA", size=only_shadow_img.size, color=(255, 255, 255, 255)
|
|
|
|
|
+ ),
|
|
|
|
|
+ mask=im_png,
|
|
|
|
|
+ )
|
|
|
|
|
+ average_brightness = calculated_shadow_brightness(only_shadow_img)
|
|
|
|
|
+ print("average_brightness:", average_brightness)
|
|
|
|
|
+
|
|
|
|
|
+ config = {
|
|
|
|
|
+ "Midtones": Midtones,
|
|
|
|
|
+ "Highlight": Highlight,
|
|
|
|
|
+ "average_brightness": average_brightness,
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return mask, config
|
|
return mask, config
|
|
|
|
|
|
|
|
- def my_test(self,**kwargs):
|
|
|
|
|
|
|
+ def my_test(self, **kwargs):
|
|
|
if "output_queue" in kwargs:
|
|
if "output_queue" in kwargs:
|
|
|
output_queue = kwargs["output_queue"]
|
|
output_queue = kwargs["output_queue"]
|
|
|
else:
|
|
else:
|
|
@@ -235,9 +375,23 @@ class GeneratePic(object):
|
|
|
output_queue.put(True)
|
|
output_queue.put(True)
|
|
|
|
|
|
|
|
@time_it
|
|
@time_it
|
|
|
- def run(self, image_path, cut_image_path, out_path, image_deal_mode=0, image_index=99,
|
|
|
|
|
- out_pic_size=1024, is_logo=True, out_process_path_1=None, out_process_path_2=None,
|
|
|
|
|
- resize_mode=None, max_box=None, logo_path="", **kwargs): # im 为cv对象
|
|
|
|
|
|
|
+ def run(
|
|
|
|
|
+ self,
|
|
|
|
|
+ image_path,
|
|
|
|
|
+ cut_image_path,
|
|
|
|
|
+ out_path,
|
|
|
|
|
+ image_deal_mode=0,
|
|
|
|
|
+ image_index=99,
|
|
|
|
|
+ out_pic_size=1024,
|
|
|
|
|
+ is_logo=True,
|
|
|
|
|
+ out_process_path_1=None,
|
|
|
|
|
+ out_process_path_2=None,
|
|
|
|
|
+ resize_mode=None,
|
|
|
|
|
+ max_box=None,
|
|
|
|
|
+ logo_path="",
|
|
|
|
|
+ curve_mask=False,
|
|
|
|
|
+ **kwargs,
|
|
|
|
|
+ ): # im 为cv对象
|
|
|
"""
|
|
"""
|
|
|
image_path:原始图
|
|
image_path:原始图
|
|
|
cut_image_path:抠图结果 与原始图尺寸相同
|
|
cut_image_path:抠图结果 与原始图尺寸相同
|
|
@@ -249,6 +403,7 @@ class GeneratePic(object):
|
|
|
out_process_path_1=None, 有阴影的图片,白底非透明
|
|
out_process_path_1=None, 有阴影的图片,白底非透明
|
|
|
out_process_path_2=None, 已抠图的图片
|
|
out_process_path_2=None, 已抠图的图片
|
|
|
resize_mode=0,1,2 主体缩小尺寸
|
|
resize_mode=0,1,2 主体缩小尺寸
|
|
|
|
|
+ curve_mask 为True时,表示为对鞋曲线部分的mask,不做剪裁
|
|
|
"""
|
|
"""
|
|
|
if "output_queue" in kwargs:
|
|
if "output_queue" in kwargs:
|
|
|
output_queue = kwargs["output_queue"]
|
|
output_queue = kwargs["output_queue"]
|
|
@@ -268,24 +423,33 @@ class GeneratePic(object):
|
|
|
|
|
|
|
|
# ================自动色阶处理
|
|
# ================自动色阶处理
|
|
|
_s = time.time()
|
|
_s = time.time()
|
|
|
- shadow_mask, config = self.get_mask_and_config(im_jpg=im_shadow, im_png=cut_image)
|
|
|
|
|
|
|
+ shadow_mask, config = self.get_mask_and_config(
|
|
|
|
|
+ im_jpg=im_shadow, im_png=cut_image, curve_mask=curve_mask
|
|
|
|
|
+ )
|
|
|
print("242 need_time_2:{}".format(time.time() - _s))
|
|
print("242 need_time_2:{}".format(time.time() - _s))
|
|
|
|
|
|
|
|
shadow_mask = shadow_mask.resize(im_shadow.size)
|
|
shadow_mask = shadow_mask.resize(im_shadow.size)
|
|
|
|
|
|
|
|
# =====抠图,形成新的阴影背景图=====
|
|
# =====抠图,形成新的阴影背景图=====
|
|
|
- _new_im_shadow = Image.new(mode="RGBA", size=im_shadow.size, color=(255, 255, 255, 255))
|
|
|
|
|
|
|
+ # TODO 待移除
|
|
|
|
|
+ # settings.app.processEvents()
|
|
|
|
|
+
|
|
|
|
|
+ _new_im_shadow = Image.new(
|
|
|
|
|
+ mode="RGBA", size=im_shadow.size, color=(255, 255, 255, 255)
|
|
|
|
|
+ )
|
|
|
_new_im_shadow.paste(im_shadow, mask=shadow_mask) # 粘贴有阴影的地方
|
|
_new_im_shadow.paste(im_shadow, mask=shadow_mask) # 粘贴有阴影的地方
|
|
|
# _new_im_shadow.show()
|
|
# _new_im_shadow.show()
|
|
|
-
|
|
|
|
|
_new_im_shadow = pil_to_cv2(_new_im_shadow)
|
|
_new_im_shadow = pil_to_cv2(_new_im_shadow)
|
|
|
_new_im_shadow = cv2.cvtColor(_new_im_shadow, cv2.COLOR_BGR2GRAY)
|
|
_new_im_shadow = cv2.cvtColor(_new_im_shadow, cv2.COLOR_BGR2GRAY)
|
|
|
- _new_im_shadow = levels_adjust(img=_new_im_shadow,
|
|
|
|
|
- Shadow=0,
|
|
|
|
|
- Midtones=config["Midtones"],
|
|
|
|
|
- Highlight=config["Highlight"],
|
|
|
|
|
- OutShadow=0,
|
|
|
|
|
- OutHighlight=255, Dim=3)
|
|
|
|
|
|
|
+ _new_im_shadow = levels_adjust(
|
|
|
|
|
+ img=_new_im_shadow,
|
|
|
|
|
+ Shadow=0,
|
|
|
|
|
+ Midtones=config["Midtones"],
|
|
|
|
|
+ Highlight=config["Highlight"],
|
|
|
|
|
+ OutShadow=0,
|
|
|
|
|
+ OutHighlight=255,
|
|
|
|
|
+ Dim=3,
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
im_shadow = cv2_to_pil(_new_im_shadow)
|
|
im_shadow = cv2_to_pil(_new_im_shadow)
|
|
|
|
|
|
|
@@ -293,7 +457,9 @@ class GeneratePic(object):
|
|
|
average_brightness = config["average_brightness"]
|
|
average_brightness = config["average_brightness"]
|
|
|
if config["average_brightness"] < 180:
|
|
if config["average_brightness"] < 180:
|
|
|
# 调整阴影亮度
|
|
# 调整阴影亮度
|
|
|
- backdrop_prepped = np.asfarray(Image.new(mode="RGBA", size=im_shadow.size, color=(255, 255, 255, 255)))
|
|
|
|
|
|
|
+ backdrop_prepped = np.asfarray(
|
|
|
|
|
+ Image.new(mode="RGBA", size=im_shadow.size, color=(255, 255, 255, 255))
|
|
|
|
|
+ )
|
|
|
im_shadow = im_shadow.convert("RGBA")
|
|
im_shadow = im_shadow.convert("RGBA")
|
|
|
source_prepped = np.asfarray(im_shadow)
|
|
source_prepped = np.asfarray(im_shadow)
|
|
|
# im_shadow.show()
|
|
# im_shadow.show()
|
|
@@ -302,8 +468,10 @@ class GeneratePic(object):
|
|
|
opacity = max(0.5, min(opacity, 1))
|
|
opacity = max(0.5, min(opacity, 1))
|
|
|
|
|
|
|
|
print("阴影透明度:{}%".format(int(opacity * 100)))
|
|
print("阴影透明度:{}%".format(int(opacity * 100)))
|
|
|
- blended_np = multiply(backdrop_prepped, source_prepped, opacity=int(opacity * 100) / 100)
|
|
|
|
|
- im_shadow = Image.fromarray(np.uint8(blended_np)).convert('RGB')
|
|
|
|
|
|
|
+ blended_np = multiply(
|
|
|
|
|
+ backdrop_prepped, source_prepped, opacity=int(opacity * 100) / 100
|
|
|
|
|
+ )
|
|
|
|
|
+ im_shadow = Image.fromarray(np.uint8(blended_np)).convert("RGB")
|
|
|
# im_shadow.show()
|
|
# im_shadow.show()
|
|
|
|
|
|
|
|
# 把原图粘贴回去,避免色差
|
|
# 把原图粘贴回去,避免色差
|
|
@@ -317,14 +485,24 @@ class GeneratePic(object):
|
|
|
out_image_1 = im_shadow.copy()
|
|
out_image_1 = im_shadow.copy()
|
|
|
if image_deal_mode == 1:
|
|
if image_deal_mode == 1:
|
|
|
out_image_1 = out_image_1.transpose(Image.FLIP_LEFT_RIGHT)
|
|
out_image_1 = out_image_1.transpose(Image.FLIP_LEFT_RIGHT)
|
|
|
- out_image_1.save(out_process_path_1)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ self.saver.save_image(
|
|
|
|
|
+ image=out_image_1, file_path=out_process_path_1, save_mode="png"
|
|
|
|
|
+ )
|
|
|
|
|
+ # save_image_by_thread(image=out_image_1, out_path=out_process_path_1)
|
|
|
|
|
+ # out_image_1.save(out_process_path_1)
|
|
|
|
|
|
|
|
# 保存抠图结果,没有底图,没有logo
|
|
# 保存抠图结果,没有底图,没有logo
|
|
|
if out_process_path_2:
|
|
if out_process_path_2:
|
|
|
out_image_2 = cut_image.copy()
|
|
out_image_2 = cut_image.copy()
|
|
|
if image_deal_mode == 1:
|
|
if image_deal_mode == 1:
|
|
|
out_image_2 = out_image_2.transpose(Image.FLIP_LEFT_RIGHT)
|
|
out_image_2 = out_image_2.transpose(Image.FLIP_LEFT_RIGHT)
|
|
|
- out_image_2.save(out_process_path_2)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ self.saver.save_image(
|
|
|
|
|
+ image=out_image_2, file_path=out_process_path_2, save_mode="png"
|
|
|
|
|
+ )
|
|
|
|
|
+ # save_image_by_thread(image=out_image_2, out_path=out_process_path_2, save_mode="png")
|
|
|
|
|
+ # out_image_2.save(out_process_path_2)
|
|
|
|
|
|
|
|
# 不生成主图时直接退出
|
|
# 不生成主图时直接退出
|
|
|
if not out_path:
|
|
if not out_path:
|
|
@@ -409,13 +587,36 @@ class GeneratePic(object):
|
|
|
image_bg = sharpen_image(image_bg, factor=settings.OUT_PIC_FACTOR)
|
|
image_bg = sharpen_image(image_bg, factor=settings.OUT_PIC_FACTOR)
|
|
|
|
|
|
|
|
if out_pic_size < 1600:
|
|
if out_pic_size < 1600:
|
|
|
- image_bg = image_bg.resize((out_pic_size, out_pic_size), resample=settings.RESIZE_IMAGE_MODE)
|
|
|
|
|
|
|
+ image_bg = image_bg.resize(
|
|
|
|
|
+ (out_pic_size, out_pic_size), resample=settings.RESIZE_IMAGE_MODE
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
if settings.OUT_PIC_MODE == ".jpg":
|
|
if settings.OUT_PIC_MODE == ".jpg":
|
|
|
- image_bg.save(out_path, quality=100, dpi=(300, 300), format="JPEG")
|
|
|
|
|
|
|
+ if settings.OUT_PIC_QUALITY == "普通":
|
|
|
|
|
+ self.saver.save_image(
|
|
|
|
|
+ image=image_bg,
|
|
|
|
|
+ file_path=out_path,
|
|
|
|
|
+ save_mode="jpg",
|
|
|
|
|
+ quality=None,
|
|
|
|
|
+ dpi=None,
|
|
|
|
|
+ _format="JPEG",
|
|
|
|
|
+ )
|
|
|
|
|
+ # save_image_by_thread(image_bg, out_path, save_mode="jpg", quality=None, dpi=None, _format="JPEG")
|
|
|
|
|
+ # image_bg.save(out_path, format="JPEG")
|
|
|
|
|
+ else:
|
|
|
|
|
+ self.saver.save_image(
|
|
|
|
|
+ image=image_bg,
|
|
|
|
|
+ file_path=out_path,
|
|
|
|
|
+ save_mode="jpg",
|
|
|
|
|
+ quality=100,
|
|
|
|
|
+ dpi=(300, 300),
|
|
|
|
|
+ _format="JPEG",
|
|
|
|
|
+ )
|
|
|
|
|
+ # save_image_by_thread(image_bg, out_path, save_mode="jpg", quality=100, dpi=(300, 300), _format="JPEG")
|
|
|
|
|
+ # image_bg.save(out_path, quality=100, dpi=(300, 300), format="JPEG")
|
|
|
else:
|
|
else:
|
|
|
- # quality=quality
|
|
|
|
|
- image_bg.save(out_path, quality=100)
|
|
|
|
|
|
|
+ self.saver.save_image(image=image_bg, file_path=out_path, save_mode="png")
|
|
|
|
|
+ # image_bg.save(out_path)
|
|
|
|
|
|
|
|
if output_queue is not None:
|
|
if output_queue is not None:
|
|
|
output_queue.put(True)
|
|
output_queue.put(True)
|