You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将高分辨率散斑图案保存为小体积可导入激光雕刻机的文件?

高分辨率散斑图案生成与轻量化保存方案求助

我需要生成高分辨率散斑图案,保存为激光雕刻机支持的PNG、JPEG、PDF、SVG或TIFF格式,核心要求是保证DPI>1000的同时控制文件体积。

现有实现代码

输入参数定义

############
#  INPUTS  #
############
dpi = 1000 # dots per inch
dpmm = 0.03937 * dpi # dots per mm
widthOfSampleMM = 50 # mm
heightOfSampleMM = 50 # mm
patternSizeMM = 0.1 # mm
density = 0.75 # 1是极密,0是极稀疏
variation = 0.75 # 1是高随机度,0是低随机度
############

图案生成逻辑

# 单位转换为像素
widthOfSamplesPX = int(np.ceil(widthOfSampleMM*dpmm)) # 计算宽度像素数
widthOfSamplesPX = widthOfSamplesPX + 10 - widthOfSamplesPX % 10 # 向上取整到最近的10的倍数
heightOfSamplePX = int(np.ceil(heightOfSampleMM*dpmm)) # 计算高度像素数
heightOfSamplePX = heightOfSamplePX + 10 - heightOfSamplePX % 10 # 向上取整到最近的10的倍数
patternSizePX = patternSizeMM*dpmm # 单个散斑图案的像素尺寸(当前用圆形)

# 初始化空白图像(白色背景)
im = 255*np.ones((heightOfSamplePX, widthOfSamplesPX), dtype = np.uint8)

# 计算水平方向的散斑中心坐标
numPoints = int(density*heightOfSamplePX/patternSizePX)
if numPoints==1:
    horizontal = [heightOfSamplePX // 2]
else:
    horizontal = [int(i * heightOfSamplePX / (numPoints + 1)) for i in range(1, numPoints + 1)]

# 计算垂直方向的散斑中心坐标
numPoints = int(density*widthOfSamplesPX/patternSizePX)
if numPoints==1:
    vertical = [widthOfSamplesPX // 2]
else:
    vertical = [int(i * widthOfSamplesPX / (numPoints + 1)) for i in range(1, numPoints + 1)]

# 生成带随机扰动的散斑图案
for i in vertical:
    for j in horizontal:
        # 添加位置随机扰动
        iWithNoise = i+variation*np.random.randint(-2*patternSizePX/density, +2*patternSizePX/density)
        jWithNoise = j+variation*np.random.randint(-2*patternSizePX/density, +2*patternSizePX/density)
        # 添加尺寸随机扰动
        patternSizePXWithNoise = patternSizePX+patternSizePX*variation*(np.random.rand()-0.5)/2
        # 绘制黑色填充圆形散斑
        cv2.circle(im, (int(iWithNoise),int(jWithNoise)), int(patternSizePXWithNoise//2), 0, -1)

效果示例

  • DPI=1000时的低质量效果:[低分辨率散斑图案,细节模糊]
  • 目标DPI(5280)的理想效果:[高分辨率散斑图案,细节清晰]

已尝试的解决方案

  • 使用plt.savefig()保存为PNG、TIFF、SVG、PDF格式,调整不同DPI参数,但未解决体积问题
  • 使用cv2.imwrite()保存,文件体积过大,仅能通过降低DPI压缩,但会直接损失画质
  • 自行编写SVG生成函数(代码如下),但生成的SVG文件体积依然过大:
import svgwrite
def matrix_to_svg(matrix, filename, padding = 0, cellSize=1):
    # 获取矩阵维度与极值
    rows, cols = matrix.shape
    minVal = np.min(matrix)
    maxVal = np.max(matrix)
    # 创建SVG绘图对象
    dwg = svgwrite.Drawing(filename, profile='tiny', 
                           size = (cols*cellSize+2*padding,rows*cellSize+2*padding))
    # 定义灰度色彩映射
    colorScale = lambda val: svgwrite.utils.rgb(int(255*(val-minVal)/(maxVal-minVal)),
                                                 int(255*(val-minVal)/(maxVal-minVal)),
                                                 int(255*(val-minVal)/(maxVal-minVal)))
    # 遍历每个像素绘制矩形
    for i in range(rows):
        for j in range(cols):
            color = colorScale(matrix[i, j])
            dwg.add(dwg.rect(insert=(j * cellSize + padding, i * cellSize + padding),
                             size=(cellSize, cellSize),
                             fill=color))
    dwg.save() # 保存SVG文件
  • 使用PIL.save()保存,同样存在文件体积过大的问题

求助需求

希望找到在保证DPI>1000画质的前提下,生成体积可控、激光雕刻机可导入的文件方案;也愿意通过优化散斑形状的生成逻辑来解决问题,求具体方向指引。

内容的提问来源于stack exchange,提问作者Tino D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:00:07