如何将高分辨率散斑图案保存为小体积可导入激光雕刻机的文件?
高分辨率散斑图案生成与轻量化保存方案求助
我需要生成高分辨率散斑图案,保存为激光雕刻机支持的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
相关产品推荐
相关产品推荐

