
VIISAN VF3240은 수백 유로에 판매되는 2400dpi A3 평판 스캐너다. 600dpi를 넘는 해상도에서는 LED 점등 시점, 모터 움직임, 센서 칩 연결부 때문에 스캔에 세 가지 결함이 생긴다. 오픈소스 드라이버 vf3240는 USB로 스캐너와 직접 통신해 이 결함을 보정한다.
스캐너 구조와 색 번짐
유리판 아래에는 스캔 면보다 조금 넓은 센서 바가 있다. 센서 바는 1728픽셀짜리 칩 18개로 구성돼 총 31,104픽셀을 담는다.1 빨강·초록·파랑 LED가 각 줄을 읽을 때 차례로 켜지므로 한 줄은 세 번 노출된다. 스테퍼 모터가 센서 바를 움직이고, ASIC이 줄 데이터를 버퍼링해 최대 약 8.5MB/s 속도로 USB를 통해 보낸다. 8비트·2400dpi로 스캔하면 전체 면의 크기는 28,751×40,320픽셀이며, 스캔에 7분이 걸린다.
아래 예시에서 왼쪽은 2400dpi 스캔 결과이고 오른쪽은 보정한 이미지다. 원본에서는 글자 가장자리 위쪽에 자홍색, 아래쪽에 초록색 테두리가 생기며, 네 줄마다 비슷한 무늬가 반복된다.
[](https://www.pagetable.com/docs/vf3240/vf3240_text_2400dpi.png)
색 테두리는 LED가 한 줄의 노출 시간 동안 차례로 켜지는 데서 생긴다. 파랑, 빨강, 초록 순으로 켜지고 그동안 센서 바도 움직인다. 따라서 세 색 채널은 종이의 서로 조금씩 다른 위치를 읽는다. 초록색이 가장 뒤쪽 위치를 읽지만 세 번의 노출은 같은 줄에 저장되므로 빨강과 파랑 데이터가 상대적으로 아래쪽에 놓인다.
흑백 페이지를 기준으로 측정하면 2400dpi에서 빨강은 초록보다 0.42줄, 파랑은 0.72줄 아래에 기록된다. 이 차이는 펌웨어의 타이밍에서 비롯되므로 모든 기기에서 같아야 한다. 600dpi 이하에서는 센서 바가 일정하게 움직이므로 랑초스 필터(Lanczos filter)로 각 채널을 다시 표본화해 해당 거리만큼 위로 이동한다. 1200dpi와 2400dpi에서는 센서 바의 움직임이 일정하지 않아 줄마다 이동량이 달라진다. 이 해상도에서는 다음에 설명하는 줄 간격 보정과 색 위치 보정을 함께 수행한다.
줄 간격과 센서 연결부 보정
두 번째 결함은 줄 사이 간격이 고르지 않다는 점이다. 모터는 인치당 600개의 완전한 단계를 움직이며, 2400dpi에서는 한 단계가 네 줄에 해당한다. 그러나 모터는 단계 안에서 일정한 속도로 움직이지 않는다. 마찰 때문에 멈춰 있다가 모터의 힘이 마찰을 넘으면 갑자기 움직인다. 네 줄은 같은 시간 간격으로 노출되므로 실제 위치는 0, 0.5, 1.6, 3.7줄 정도가 된다. 일정하게 움직였을 때의 0, 1, 2, 3줄과 다르다.
이 간격은 기기마다 다르고 스캔 중에도 변한다. 드라이버는 이미지를 읽어 가며 인접한 줄이 서로 얼마나 다른지 측정해 종이 위에서 줄 사이가 얼마나 떨어져 있었는지 추정한다. 한 모터 단계의 네 줄 간격을 각각 측정하고, 같은 방식으로 빨강·파랑 채널과 초록 채널의 위치 차이도 구한다.
간격을 측정한 뒤에는 줄마다 다시 표본화한다. 실제 위치의 표본들을 지나는 매끄러운 곡선을 만들고, 줄이 고르게 놓였어야 할 위치에서 값을 읽는다. 보정 후에는 줄 간격이 균일해지고 색 채널도 정렬된다. 다만 모터가 크게 튀어 움직인 구간은 다른 줄보다 조금 흐릿하게 남는다. 그곳의 종이 정보를 충분히 읽지 못했으므로 기록되지 않은 정보는 복원할 수 없다.
세 번째 결함은 센서 칩 사이의 이음매에서 생긴다. 칩 18개가 정확히 맞닿지 않아 이음매마다 픽셀이 몇 개씩 빠진다. 그 결과 이음매 오른쪽의 내용은 왼쪽으로 밀리고, 이음매를 지나는 줄에는 꺾임이 생긴다. 아래 이미지는 2400dpi로 스캔한 망점이 칩 이음매에서 옆으로 어긋나는 모습을 보여준다. 왼쪽은 원본이고 오른쪽은 보정한 결과다.
[](https://www.pagetable.com/docs/vf3240/vf3240_seam_2400dpi.png)
픽셀 간격은 이음매마다 3~5픽셀이며 기기마다 달라 직접 측정해야 한다. 드라이버는 규칙적인 점 격자가 인쇄된 보정 용지를 사용한다. 이음매 오른쪽의 격자가 왼쪽으로 밀린 거리를 측정하면 빠진 픽셀 폭을 알 수 있다. 같은 측정으로 칩들이 세로 방향으로도 조금씩 어긋나 있음을 확인할 수 있으며, 센서 바 전체에 걸친 오차는 약 12줄이다. 드라이버에는 출력할 수 있는 보정 용지와 보정 모드가 포함돼 있다. 보정하지 않으면 이음매마다 4픽셀을 적용하고 매 스캔 때 경고를 표시한다.
이음매를 보정할 때는 각 줄을 늘려 빠진 픽셀을 채우고, 칩마다 세로 위치 오차를 반영해 칩의 열을 위아래로 이동한다. 보정 뒤에도 픽셀 일부에 해당하는 오차는 남는다.
드라이버 사용 조건
제조사의 드라이버는 세 결함을 보정하지 않는다. 이 오픈소스 드라이버는 제조사 Linux 드라이버에서 프로토콜을 알아내 사양서로 정리한 뒤 작성됐다. 200~2400dpi 해상도, 컬러와 회색조, 8비트와 16비트, 스캔 면의 임의 영역, 전면 패널 버튼을 통한 스캔을 지원한다.
cargo build --release
vf3240 page.tif --dpi 2400
vf3240 --seam-target target.pdf # print, lay on the bed, then:
vf3240 --calibrate-seams
소스 코드와 문서는 github.com/mist64/vf3240에서 확인할 수 있다.
스캐너의 전체 센서 31,104픽셀 가운데 28,751픽셀만 스캔 면을 바라본다. 따라서 첫 번째 칩과 두 번째 칩의 일부는 이미지 바깥에 놓이고, 17개 이음매 중 16개가 이미지 안에 들어온다.↩
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요