|
@@ -145,6 +145,35 @@ class GeneratePic(object):
|
|
|
return return_mask, config
|
|
return return_mask, config
|
|
|
|
|
|
|
|
@time_it
|
|
@time_it
|
|
|
|
|
+ def fast_remove_black_dots(self, mask_img, max_area=50):
|
|
|
|
|
+ """
|
|
|
|
|
+ 极速去除黑白蒙版中面积 <= max_area 的黑色噪点
|
|
|
|
|
+ """
|
|
|
|
|
+ # 1. 确保是纯黑白二值图 (0 和 255)
|
|
|
|
|
+ # 如果原图有灰度,先做二值化,否则连通域计算会出错
|
|
|
|
|
+ if mask_img.mode != 'L':
|
|
|
|
|
+ mask_img = mask_img.convert('L')
|
|
|
|
|
+ img_array = np.array(mask_img)
|
|
|
|
|
+ _, binary = cv2.threshold(img_array, 127, 255, cv2.THRESH_BINARY)
|
|
|
|
|
+
|
|
|
|
|
+ # 2. 连通域分析 (C++底层,极快)
|
|
|
|
|
+ # 注意:OpenCV 默认白色(255)是前景,黑色(0)是背景
|
|
|
|
|
+ # 我们要找的是“黑色的噪点”,所以先取反
|
|
|
|
|
+ inv_binary = cv2.bitwise_not(binary)
|
|
|
|
|
+ num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(inv_binary, connectivity=8)
|
|
|
|
|
+
|
|
|
|
|
+ # 3. 提取需要去除的黑色区域
|
|
|
|
|
+ # stats 包含每个连通域的面积 (cv2.CC_STAT_AREA)
|
|
|
|
|
+ # 第 0 个标签是背景(原图的大面积白色),从 1 开始是黑色噪点
|
|
|
|
|
+ areas = stats[1:, cv2.CC_STAT_AREA]
|
|
|
|
|
+ small_dots_indices = np.where(areas <= max_area)[0] + 1 # 索引要加1,对应回 labels
|
|
|
|
|
+
|
|
|
|
|
+ # 4. 批量修改原图(向量化操作,无需 for 循环)
|
|
|
|
|
+ mask_to_remove = np.isin(labels, small_dots_indices)
|
|
|
|
|
+ binary[mask_to_remove] = 255 # 将小噪点涂白
|
|
|
|
|
+ return Image.fromarray(binary, mode='L')
|
|
|
|
|
+
|
|
|
|
|
+ @time_it
|
|
|
def get_mask_and_config_v4_online(self, ori_im_jpg: Image, ori_im_png: Image, im_jpg: Image, im_png: Image):
|
|
def get_mask_and_config_v4_online(self, ori_im_jpg: Image, ori_im_png: Image, im_jpg: Image, im_png: Image):
|
|
|
print("179------当前计算函数:get_mask_and_config_v4_online")
|
|
print("179------当前计算函数:get_mask_and_config_v4_online")
|
|
|
"""
|
|
"""
|
|
@@ -172,6 +201,7 @@ class GeneratePic(object):
|
|
|
_, new_box = get_mini_crop_img(img=ori_im_png)
|
|
_, new_box = get_mini_crop_img(img=ori_im_png)
|
|
|
bg_mask = bg_mask.crop(new_box) # 切图
|
|
bg_mask = bg_mask.crop(new_box) # 切图
|
|
|
bg_mask = bg_mask.resize(im_png.size)
|
|
bg_mask = bg_mask.resize(im_png.size)
|
|
|
|
|
+ bg_mask = self.fast_remove_black_dots(bg_mask, max_area=50)
|
|
|
# bg_mask = expand_or_shrink_mask(pil_image=bg_mask, expansion_radius=6, blur_radius=0)
|
|
# bg_mask = expand_or_shrink_mask(pil_image=bg_mask, expansion_radius=6, blur_radius=0)
|
|
|
else:
|
|
else:
|
|
|
bg_mask = False
|
|
bg_mask = False
|