이전 블로그에서 카메라 렌즈 종류에 대해서 소개 했었는데, 그 렌즈 중에는 라인 스캔 카메라가 있었습니다. TDI (Time Delay Integration) 라인 스캔 카메라는 고속으로 이동한는 물체를 고해상도로 촬영하기 위해 설계된 특수한 라인 스캔 카메라로 볼 수 있습니다. 보통 한 라인을 이용하여 이미지를 만드는 경우 작은 영역에 한 번만 노출되기 때문에 감도가 낮고 노이즈에 취약할 수 있습니다.
TDI 라는 명칭에서 처럼 시간 지연을 통한 적분 기술을 이용하여 고감도 이미지를 만듭니다. TDI에서는 1 X N 라인을 이용하며, 이미지 센서에 여러 라인이 배열되어 있어 대상이 이동함에 따라 각 라인이 같은 위치를 순차적으로 촬영 및 누적합니다. 예를 들어 N = 64 라면 물체의 동일한 위치를 64번 촬영한다는 의미로 볼 수 있고, 신호는 64배 증가하고 노이즈는 8배 증가하므로 SNR(Signal to Noise Ratio)이 향상됩니다.
TDI 라인 스캔 카메라의 특징은 라인 수를 증가 시킬 수록 고감도 이미지를 얻을 수 있으며 노이즈 감소와 빠르게 이동하는 물체에 대해 고속 촬용이 가능합니다. 따라서 컨베이어 벨트에 제품을 이동시키면서 검사하는 산업 분야인 PCB 검사, 인쇄물 검사 등에 많이 활용됩니다. 그림에서 같이 라인 수에 따라 Single Line, Dual Line, TDI 형태로 구분 할 수도 있습니다.
TDI 활용 분야 중에는 반도체 검사가 있습니다. 웨이퍼에 이물질이나 결함 검사시에 이미지를 활용하는 경우가 많으며 수십 나노미터 또는 수 나노미터 크기의 노이즈 탐색 시 주요하게 활용됩니다. 일반적으로 반도체 분야에 사용되는 TDI는 256 라인 스캔이 활용되며, 컨베이어 벨트 예와 반대로 웨이퍼가 고정된 상태에서 라인 스캔이 이동함으로써 이미지를 구현합니다.
TDI의 이미지 합성은 1) N개 라인에 촬영된 이미지 배열을 같은 위치의 정보가 일치하도록 정렬하고, 2) 각 위치의 픽셀값을 전체 더하거나 평균값을 구합니다. 3) 마지막으로 출력할 이미지 Depth에 맞게 스케일링 될 수 있도록 정규화 합니다. 아래는 현 과정을 시뮬레이션 해 볼 수 있는 파이썬 예제 코드 입니다.
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 가상으로 대상 이미지 생성
height, width = 100, 200
moving_obj = np.zeros((height, width), dtype=np.uint8)
# 대상 밝은 줄이 이동하는 효과
for i in range(height):
moving_obj[i, 50 + (i % 50)] = 255 # 대각선 방향 밝기
# 일반 라인 스캔 (한 라인)
line_scan_img = np.zeros((height, width), dtype=np.uint8)
for i in range(height):
line = moving_obj[i:i+1, :] # 한 줄
line_scan_img[i:i+1, :] = line
# TDI 라인 스캔 (8 라인 누적)
TDI_stage = 8
tdi_img = np.zeros((height - TDI_stage, width), dtype=np.uint16)
for i in range(height - TDI_stage):
acc_line = np.zeros_like(line, dtype=np.uint16)
for j in range(TDI_stage):
acc_line += moving_obj[i + j:i + j + 1, :]
tdi_img[i:i+1, :] = acc_line
# 정규화(스케일링)
tdi_img_norm = cv2.convertScaleAbs(tdi_img, alpha=255.0 / (TDI_stage * 255))
# 결과 보기
plt.figure(figsize=(12, 6))
plt.subplot(1, 3, 1)
plt.title("Original Moving Image")
plt.imshow(moving_obj, cmap='gray')
plt.subplot(1, 3, 2)
plt.title("Line Scan Image")
plt.imshow(line_scan_img, cmap='gray')
plt.subplot(1, 3, 3)
plt.title("TDI Result (8 stages)")
plt.imshow(tdi_img_norm, cmap='gray')
plt.tight_layout()
plt.show()
'영상처리 도구' 카테고리의 다른 글
머신 비전 Machine Vision을 위한 렌즈 특성과 용어의 이해 (0) | 2025.07.06 |
---|---|
머신 비전 Machine Vision을 위한 카메라 렌즈 종류와 선택(2) (0) | 2025.07.02 |
머신 비전 Machine Vision을 위한 카메라 렌즈 종류와 선택(1) (0) | 2025.06.29 |
OpenCV Mat 데이터 처리 기본을 알고 활용하기 (0) | 2025.06.15 |
OpenCV 영상처리 외곽선 추출과 응용 findContours (0) | 2025.06.08 |