Extensions/ComfyUI_DCTCompress4OpenCurve_CustomNode
ComfyUI Extension

ComfyUI_DCTCompress4OpenCurve_CustomNode

Line Segment Detector combined with DCT compression for extracting and smoothing curves in ComfyUI image processing. (Description by CC)

By bemoregt·Created about a month ago·Updated about a month ago· 1
bemoregt/ComfyUI_DCTCompress4OpenCurve_CustomNode
Nodes
On cloudLocal install
Stars1
Updatedabout a month ago
Readme

ComfyUI-LSD-DCT-Curve

이미지 속 개곡선(선/획/경로)을 LSD(Line Segment Detector)로 검출하고, 검출된 직선 조각들을 하나의 곡선으로 체이닝한 뒤 DCT로 스무딩/압축하는 ComfyUI 커스텀 노드입니다.

설치

  1. 이 폴더 전체를 ComfyUI/custom_nodes/ 아래에 복사합니다.

    ComfyUI/custom_nodes/ComfyUI-LSD-DCT-Curve/
    
  2. ComfyUI가 사용하는 Python 환경에서 의존성을 설치합니다.

    pip install -r ComfyUI/custom_nodes/ComfyUI-LSD-DCT-Curve/requirements.txt
    

    opencv-contrib-pythoncv2.ximgproc.createFastLineDetector (FLD) 폴백에 필요합니다. 이미 opencv-python이 설치되어 있다면 충돌을 피하기 위해 먼저 제거 후 설치하세요.

    pip uninstall opencv-python
    pip install opencv-contrib-python
    
  3. 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_kept
    • smoothed_curve: 스무딩된 곡선의 [x, y] 좌표 배열
    • dct_coeffs_x, dct_coeffs_y: 남겨진 DCT 계수 (다른 노드에서 재구성/비교용으로 활용 가능)

동작 원리

  1. 검출: cv2.createLineSegmentDetector(LSD)를 우선 시도하고, 특허 이슈로 해당 API가 없는 OpenCV 빌드에서는 cv2.ximgproc.createFastLineDetector(FLD)로 자동 폴백합니다.
  2. 체이닝: LSD/FLD는 곡선을 여러 개의 짧은 직선 조각으로 반환하므로, 인접한 조각의 끝점을 그리디하게 최근접 연결해 하나의 순서 있는 폴리라인으로 합칩니다.
  3. 리샘플링: DCT는 균일 샘플링을 전제하므로, 체이닝된 폴리라인을 호 길이(arc length) 기준으로 num_samples개 점으로 다시 뽑습니다.
  4. DCT 스무딩/압축: x(t), y(t) 시퀀스에 각각 DCT-II를 적용하고 저주파 num_dct_coeffs개만 남긴 뒤 역변환해 잡음이 제거된 곡선을 복원합니다.

알려진 제한

  • 여러 개의 분리된 곡선이 한 이미지에 있는 경우, 현재 버전은 모든 조각을 하나의 곡선으로 체이닝합니다(설계상 가정). 분리된 곡선을 각각 다루려면 max_gap을 낮추거나 별도 배치 처리가 필요합니다.
  • DCT 계수를 적게 남길수록 곡선 양 끝단에 약간의 처짐/리플이 생길 수 있습니다(경계 처리 특성).

실행 예시

실제 ComfyUI에서 이미지 로드 → LSD -> DCT Curve Smoother → 이미지 미리보기로 연결해 실행한 결과입니다. 검정 선이 원본, 빨간 선이 LSD로 검출·체이닝 후 DCT로 스무딩된 곡선입니다.

| | | |---|---| | Z자 곡선 예시 num_dct_coeffs=7 — 꺾인 Z자 모양도 적은 계수로 형태를 보존 | 중첩 사각형 예시 num_dct_coeffs=39 — 중첩된 사각형 개곡선(G자 형태)도 안정적으로 추종 | | 여러 개의 분리된 곡선 예시 num_dct_coeffs=39 — 서로 떨어진 곡선 여러 개가 하나의 폴리라인으로 체이닝되는 알려진 제한을 보여주는 예시 | S자 곡선 예시 num_dct_coeffs=37 — 굴곡이 많은 S자 곡선도 노이즈 없이 매끄럽게 복원 |