彩色色板计数提速咨询:如何用Python替代Photoshop脚本实现高效统计
彩色色板计数Python实现方案
需求前提
- 待统计色板为规则同尺寸,按棋盘格排列,颜色不固定,数量范围从数百到约9万不等
- 示例图:

- 示例统计目标:上述仅含3种颜色的示例中,需统计得到浅绿方块数量为8
现有方案痛点
你目前在用的Photoshop JS脚本方案逻辑是逐点采样色板中心RGB值,存入数组后和预设色值匹配计数,对应原脚本如下:
var pointSample = app.activeDocument.colorSamplers.add([x,y]); // Obtain array of RGB values. var rgb = [ Math.round(pointSample.color.rgb.red,0), Math.round(pointSample.color.rgb.green,0), Math.round(pointSample.color.rgb.blue,0) ]; colArr.push(rgb); delete_all_colour_samples(); function delete_all_colour_samples() { app.activeDocument.colorSamplers.removeAll(); }
该方案小样量下运行无延迟,但是样本量超过3000时耗时达到25秒,无法满足批量统计需求。
Python实现方案
用Python实现该功能性能远高于Photoshop脚本方案,9万样本量处理耗时可以控制在百毫秒级,核心用opencv-python和numpy两个库实现,具体如下:
实现逻辑
- 直接把整张图片加载为numpy数组,避免逐点采样的IO开销
- 根据提前已知的单个色板尺寸,批量计算所有色板的中心坐标,一次性取出所有中心位置的RGB值
- 用numpy的广播机制批量做色值匹配,完全规避Python层循环的性能损耗
依赖安装
pip install opencv-python numpy
完整代码
import cv2 import numpy as np def count_swatches(image_path, swatch_w, swatch_h, target_rgb): # 读取图片并转成RGB格式 img = cv2.imread(image_path) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) h, w = img_rgb.shape[:2] # 计算横向、纵向色板数量 col_count = w // swatch_w row_count = h // swatch_h # 批量生成所有色板的中心坐标 x_centers = np.arange(swatch_w//2, w, swatch_w, dtype=np.int32) y_centers = np.arange(swatch_h//2, h, swatch_h, dtype=np.int32) # 一次性取出所有中心位置的RGB值 sample_rgb = img_rgb[y_centers[:, None], x_centers] # 匹配目标色值并统计数量 match_mask = (sample_rgb == target_rgb).all(axis=-1) return np.count_nonzero(match_mask) # 调用示例 if __name__ == "__main__": # 替换为实际参数即可 IMAGE_PATH = "你的色板图片路径.png" SWATCH_WIDTH = 20 # 单个色板的宽度,单位像素 SWATCH_HEIGHT = 20 # 单个色板的高度,单位像素 TARGET_COLOR = [144, 238, 144] # 要统计的目标色RGB值 count = count_swatches(IMAGE_PATH, SWATCH_WIDTH, SWATCH_HEIGHT, TARGET_COLOR) print(f"目标色板数量:{count}")
额外说明
如果需要同时统计多种颜色,只需要把target_rgb改为多组色值的数组,调整匹配逻辑即可,不需要重复读取采样图片。
内容的提问来源于stack exchange,提问作者Ghoul Fool
相关产品推荐
相关产品推荐

