6d666b6f80fdc08881b80e28107ca59ff24dbeb5
Detects line segments with LSD (falling back to FLD when unavailable), chains them into a single polyline, and truncates its DCT coefficients to produce a smoothed/compressed curve, output as both an image and JSON. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
ComfyUI-LSD-DCT-Curve
이미지 속 개곡선(선/획/경로)을 LSD(Line Segment Detector)로 검출하고, 검출된 직선 조각들을 하나의 곡선으로 체이닝한 뒤 DCT로 스무딩/압축하는 ComfyUI 커스텀 노드입니다.
설치
-
이 폴더 전체를
ComfyUI/custom_nodes/아래에 복사합니다.ComfyUI/custom_nodes/ComfyUI-LSD-DCT-Curve/ -
ComfyUI가 사용하는 Python 환경에서 의존성을 설치합니다.
pip install -r ComfyUI/custom_nodes/ComfyUI-LSD-DCT-Curve/requirements.txtopencv-contrib-python은cv2.ximgproc.createFastLineDetector(FLD) 폴백에 필요합니다. 이미opencv-python이 설치되어 있다면 충돌을 피하기 위해 먼저 제거 후 설치하세요.pip uninstall opencv-python pip install opencv-contrib-python -
ComfyUI를 재시작하면 노드 목록의
curve/detection카테고리에 "LSD -> DCT Curve Smoother" 노드가 나타납니다.
노드: LSD -> DCT Curve Smoother
입력
image(IMAGE): 개곡선이 포함된 이미지
위젯
| 이름 | 설명 | 기본값 |
|---|---|---|
num_dct_coeffs |
저주파부터 남길 DCT 계수 개수. 작을수록 더 많이 스무딩/압축됨 | 16 |
num_samples |
DCT 전에 곡선을 균일 리샘플링할 점 개수 | 256 |
min_segment_length |
이보다 짧은 LSD 조각(잡음)은 무시 | 5.0 |
max_gap |
체이닝 시 허용하는 최대 끝점 간격. 0이면 무제한(이미지 전체를 하나의 곡선으로 간주) |
0.0 |
canvas_mode |
결과 곡선을 그릴 배경: overlay_on_original / blank_black / blank_white |
overlay_on_original |
line_thickness |
그려지는 곡선 두께(px) | 2 |
line_color |
"R,G,B" 형식의 곡선 색상 |
255,0,0 |
출력
image(IMAGE): 스무딩된 곡선이 그려진 이미지curve_json(STRING): 검출/체이닝/DCT 결과를 담은 JSON. 필드:engine: 실제 사용된 검출 엔진 ("LSD"또는"FLD")num_raw_segments: LSD/FLD가 검출한 직선 조각 개수num_chained_points: 체이닝 후 폴리라인 점 개수num_samples,num_dct_coeffs_keptsmoothed_curve: 스무딩된 곡선의[x, y]좌표 배열dct_coeffs_x,dct_coeffs_y: 남겨진 DCT 계수 (다른 노드에서 재구성/비교용으로 활용 가능)
동작 원리
- 검출:
cv2.createLineSegmentDetector(LSD)를 우선 시도하고, 특허 이슈로 해당 API가 없는 OpenCV 빌드에서는cv2.ximgproc.createFastLineDetector(FLD)로 자동 폴백합니다. - 체이닝: LSD/FLD는 곡선을 여러 개의 짧은 직선 조각으로 반환하므로, 인접한 조각의 끝점을 그리디하게 최근접 연결해 하나의 순서 있는 폴리라인으로 합칩니다.
- 리샘플링: DCT는 균일 샘플링을 전제하므로, 체이닝된 폴리라인을 호 길이(arc length) 기준으로
num_samples개 점으로 다시 뽑습니다. - DCT 스무딩/압축: x(t), y(t) 시퀀스에 각각 DCT-II를 적용하고 저주파
num_dct_coeffs개만 남긴 뒤 역변환해 잡음이 제거된 곡선을 복원합니다.
알려진 제한
- 여러 개의 분리된 곡선이 한 이미지에 있는 경우, 현재 버전은 모든 조각을 하나의 곡선으로 체이닝합니다(설계상 가정). 분리된 곡선을 각각 다루려면
max_gap을 낮추거나 별도 배치 처리가 필요합니다. - DCT 계수를 적게 남길수록 곡선 양 끝단에 약간의 처짐/리플이 생길 수 있습니다(경계 처리 특성).
Languages
Python
100%