Przeglądaj źródła

feat(config): 添加前后加速度配置参数并优化图像处理功能

- 新增前后加速度、减速度和最大速度配置项
- 实现快速去除黑白蒙版中小面积黑色噪点的功能
- 在图像处理流程中集成噪点去除算法以提升图像质量
- 使用连通域分析实现高效的向量化噪点处理
- 集成到现有的蒙版生成和图像处理管道中
rambo 1 tydzień temu
rodzic
commit
064122e281

+ 9 - 0
python/conifg_info.py

@@ -565,3 +565,12 @@ class ConfigManager:
         # 转盘最大速度 默认可以是1000
         self.turntable_max_speed = 0
         self._set_key_int(_key="turntable_max_speed", _addr=135, _tips="转盘最大速度", )
+        # 前后加速度
+        self.qh_up_speed = 250
+        self._set_key_int(_key="qh_up_speed", _addr=136, _tips="前后加速度", )
+        # 前后减速度
+        self.qh_down_speed = 250
+        self._set_key_int(_key="qh_down_speed", _addr=137, _tips="前后减速度", )
+        # 前后最大速度 默认可以是1000
+        self.qh_max_speed = 0
+        self._set_key_int(_key="qh_max_speed", _addr=138, _tips="前后最大速度", )

+ 30 - 0
python/service/grenerate_main_image_test.py

@@ -145,6 +145,35 @@ class GeneratePic(object):
         return return_mask, config
 
     @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):
         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)
             bg_mask = bg_mask.crop(new_box)  # 切图
             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)
         else:
             bg_mask = False