도트(Dot) 기반 이미지 변환 시스템에서 엣지 검출 알고리즘을 Canny에서 Custom Sobel로 전환한 기술적 배경과 근거를 설명하고자 합니다. 이 변경은 단순한 알고리즘 교체가 아닌, “어떤 소스 이미지에서 점을 찍어야 가장 이상적인 결과가 나오는가” 라는 근본적인 질문에 대한 해답을 찾는 과정이었습니다.

Canny와 Sobel의 본질적 차이점

Canny 엣지 검출의 특성

  • 바이너리 출력: Canny는 설계상 0(배경) 또는 255(엣지)의 이진 출력만 제공
  • 얇은 엣지: Non-maximum suppression과 hysteresis thresholding을 통해 1픽셀 너비의 가는 선만 추출
  • 노이즈 제거: 강력한 노이즈 억제로 깔끔하지만 정보 손실 발생

Sobel 엣지 검출의 특성

  • 연속적 출력: 그래디언트 크기에 따른 0~255 범위의 연속적인 값 제공
  • 두꺼운 엣지: 그래디언트 강도에 따른 영역 형태의 엣지 생성
  • 강도 정보 보존: 엣지의 세기에 따른 다단계 표현 가능

도트 기반 도메인에서의 Canny 한계점

샘플링 불안정성

Canny의 1픽셀 너비 엣지는 격자 기반 도트 샘플링 시 다음 문제를 발생시켰습니다:

  • 엣지 누락: 가는 선이 샘플링 격자를 비껴가면서 도트가 찍히지 않는 영역 발생
  • 불연속성: 원본의 부드러운 곡선이 뚝뚝 끊어진 점들로 표현
  • 예측 불가능성: 동일한 설정에도 이미지에 따라 결과의 일관성 부족

표현력의 한계

  • 단조로운 결과: 모든 도트가 동일한 중요도를 가져 평면적인 결과물 생성
  • 명암 손실: 원본의 강약, 질감, 깊이감 정보 완전 소실
  • 이진화의 한계: 흑/백만으로는 복합적인 시각적 정보 표현 불가

Custom Sobel 솔루션

Custom Sobel 알고리즘 설계 원리

도트 기반 변환에 최적화된 Custom Sobel 알고리즘은 다음과 같은 핵심 설계 철학을 기반으로 개발되었습니다:

기본 Sobel 연산 활용

# X방향 Sobel 커널 (수직 엣지 검출)
sobel_x = [[-1, 0, 1],
           [-2, 0, 2],
           [-1, 0, 1]]
 
# Y방향 Sobel 커널 (수평 엣지 검출)
sobel_y = [[-1, -2, -1],
           [ 0,  0,  0],
           [ 1,  2,  1]]
 

그래디언트 크기 계산 및 3단계 분류

# 1단계: 그래디언트 크기 계산
gradient_magnitude = sqrt(sobel_x² + sobel_y²)
 
# 2단계: 적응적 임계값 설정
high_threshold = gradient_magnitude.mean() + gradient_magnitude.std() * 1.5
low_threshold = high_threshold * 0.4
 
# 3단계: 3단계 분류
if gradient_magnitude >= high_threshold:
    pixel_value = 255  # 강한 엣지
elif gradient_magnitude >= low_threshold:
    pixel_value = 128  # 약한 엣지
else:
    pixel_value = 0    # 배경
 

도트 변환 최적화를 위한 커스터마이징

적응적 임계값 시스템

표준 Sobel과 달리, 우리의 Custom Sobel은 이미지별 특성을 고려한 적응적 임계값을 사용합니다:

  • 통계 기반 임계값: 각 이미지의 그래디언트 분포에 따라 동적으로 임계값 조정
  • 표준편차 활용: 이미지의 복잡도에 따라 high/low threshold 비율 자동 조정
  • 노이즈 내성: 과도한 세부사항 억제로 도트 변환에 적합한 주요 구조만 추출

영역 확장 및 연결성 강화

# 모폴로지 연산으로 엣지 영역 확장
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
edges = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)  # 끊어진 엣지 연결
edges = cv2.dilate(edges, kernel, iterations=1)          # 엣지 영역 확장
 

목적:

  • 끊어진 엣지 선을 연결하여 도트 샘플링 시 연속성 확보
  • 엣지 영역을 적절히 확장하여 샘플링 안정성 향상
  • 1픽셀 너비 선을 2-3픽셀 영역으로 확장하여 격자 누락 방지

도트 밀도 기반 표현 시스템

강도별 샘플링 전략

Custom Sobel의 3단계 출력은 도트 변환 시 다음과 같이 해석됩니다:

# 강한 엣지 (255): 고밀도 샘플링
if pixel_value == 255:
    sampling_probability = 1.0     # 100% 확률로 도트 배치
 
# 약한 엣지 (128): 저밀도 샘플링
elif pixel_value == 128:
    sampling_probability = 0.3     # 30% 확률로 도트 배치
 
# 배경 (0): 샘플링 제외
else:
    sampling_probability = 0.0     # 도트 배치 안함
 

시각적 표현 효과

원본 이미지의 강한 윤곽선:
Custom Sobel → 255 영역 → ●●●●●●● (조밀한 도트)

원본 이미지의 은은한 음영:
Custom Sobel → 128 영역 → ● ● ● ● (성긴 도트)

원본 이미지의 배경:
Custom Sobel → 0 영역 → (도트 없음)

기존 Sobel 대비 개선사항

표준 Sobel의 한계

  • 고정 임계값: 모든 이미지에 동일한 기준 적용으로 최적화 부족
  • 이진 출력: 강도 정보 손실로 단조로운 결과
  • 후처리 부재: 도트 변환을 고려하지 않은 날것의 그래디언트

Custom Sobel의 개선

  • 적응적 처리: 이미지별 최적 임계값으로 일관된 품질 보장
  • 3단계 출력: 강도별 차등 표현으로 풍부한 시각적 정보 제공
  • 도메인 특화: 도트 변환 특성을 고려한 엣지 영역 최적화

결과

  • 샘플링 안정성: 넓은 엣지 영역으로 도트 누락 방지
  • 표현 다양성: 강도별 도트 밀도 차이로 풍부한 시각적 표현
  • 일관성: 이미지 특성과 무관하게 예측 가능한 결과 보장

Canny에서 Custom Sobel로의 전환은 범용 알고리즘의 한계를 인식하고, 도트 기반 변환이라는 특수한 도메인에 최적화된 솔루션을 개발한 전략적 선택이었습니다. 이를 통해 단순히 기술적 성능을 개선한 것이 아니라, 도트로 표현되는 예술적 결과물의 품질을 근본적으로 개선할 수 있었습니다.