ComfyUI_DCTCompress4OpenCurve_CustomNode
Line Segment Detector combined with DCT compression for extracting and smoothing curves in ComfyUI image processing. (Description by CC)
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 계수를 적게 남길수록 곡선 양 끝단에 약간의 처짐/리플이 생길 수 있습니다(경계 처리 특성).
실행 예시
실제 ComfyUI에서 이미지 로드 → LSD -> DCT Curve Smoother → 이미지 미리보기로 연결해 실행한 결과입니다. 검정 선이 원본, 빨간 선이 LSD로 검출·체이닝 후 DCT로 스무딩된 곡선입니다.
| | |
|---|---|
|
num_dct_coeffs=7 — 꺾인 Z자 모양도 적은 계수로 형태를 보존 |
num_dct_coeffs=39 — 중첩된 사각형 개곡선(G자 형태)도 안정적으로 추종 |
|
num_dct_coeffs=39 — 서로 떨어진 곡선 여러 개가 하나의 폴리라인으로 체이닝되는 알려진 제한을 보여주는 예시 |
num_dct_coeffs=37 — 굴곡이 많은 S자 곡선도 노이즈 없이 매끄럽게 복원 |