python—图片转dxf类型(目前只能画出轮廓)
gitee地址
https://gitee.com/dobest-li/python—convert-image-to-dxf
下载包注意
如果pip时出现socket.timeout:The read operation timed out
一般是下载过慢,超出默认时间,修改响应时间即可。
windows: pip --default-timeout=100 install xxx
linux: pip --default-timeout=100 install -U xxx
大概思路:
- 获取图片,实现二值化,然后再利用使用高斯模糊来减少噪声,再利用canny获取轮廓,使用ezdxf进行描边。
注意:
- 因为是二值化图,所以不能使用彩色图,用示例中那种
- 这个只能辅助画图,有些软件是可以直接进行导出导入,远远比代码中更为精细
- 图片越清晰,放大之后不是断断续续的黑点,那么对其生成的dxf也会越精细,虽然只有轮廓
- 对于圆形,如果用霍夫圆去检测,有时候检测出多个圆,所以没有放到下边代码中,现在所展示的圆是通过线段的方式去描出(可以考虑)
代码实现:
import cv2
import numpy as np
import ezdxf
def image_to_dxf(image_path, dxf_path):
# 读取图像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
#图像反转
flipped_image = cv2.flip(image, -1)
flipped_image2 = cv2.flip(flipped_image, 1)
if image is None:
raise ValueError("无法读取图像文件")
# image[image < 50] = 0
blurred = cv2.GaussianBlur(flipped_image2, (3, 3), 0)
# 使用阈值处理来二值化图像(如果需要进一步处理)
_, thresholded = cv2.threshold(blurred, 211, 255, cv2.THRESH_BINARY)
# 使用Canny边缘检测算法提取边缘
edges = cv2.Canny(thresholded, 3, 20,apertureSize=7,L2gradient=True)
# 找到轮廓
# 简单找到轮廓点 这个文件相对小
# contours, _ = cv2.findContours(edges, cv2.RETR_LIST ,cv2.CHAIN_APPROX_SIMPLE)
# cv2.CHAIN_APPROX_NONE找到所有轮廓点 这个文件相对较大
contours, _ = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# 创建新的DXF文档
doc = ezdxf.new()
msp = doc.modelspace()
# 遍历轮廓并添加到DXF文件中
for contour in contours:
# 将轮廓的ndarray转换为列表的列表(每个子列表是一个(x, y)坐标对)
points = contour.reshape(-1, 2).tolist()
msp.add_polyline2d(points)
# 保存DXF文件
doc.saveas(dxf_path)
# 调用函数
#jpg png 都可以
image_to_dxf('templates\\test.png', 'output.dxf')
代码实现的效果
原先图片
使用代码之后的dxf文件: