MOMSOFT / 가이드
이미지 텍스트 추출(OCR) 완벽 가이드
OCR은 마법이 아니라 확률 추정입니다. 원리와 한계를 알면 어떤 이미지를 넣어야 결과가 좋아지는지, 어디까지 믿고 어디부터 검수해야 하는지가 명확해집니다.
프로젝트 문의하기 →OCR은 글자를 "읽는" 것이 아니라 "추정"합니다
OCR(Optical Character Recognition, 광학 문자 인식)은 이미지 안의 픽셀 덩어리를 보고 그것이 어떤 문자일지 확률적으로 맞히는 기술입니다. 중요한 전제가 하나 있습니다. 사진이나 스캔본에는 문자 코드가 전혀 들어 있지 않습니다. 사람 눈에는 "계약서"라고 보이지만 파일 안에는 명암이 다른 점들만 있을 뿐입니다. OCR은 그 점들의 배치를 보고 가장 그럴듯한 글자를 골라내는 것이므로, 원리상 100% 정확할 수 없습니다.
대부분의 OCR 엔진은 비슷한 단계를 거칩니다. 먼저 전처리에서 이미지를 흑백으로 이진화하고, 기울어진 페이지를 바로 세우고(deskew), 얼룩과 노이즈를 제거합니다. 다음으로 레이아웃 분석에서 어디가 본문이고 어디가 표, 그림, 머리말인지 영역을 나눕니다. 그리고 각 텍스트 줄을 문자 인식 모델에 넣어 후보 문자열을 뽑고, 마지막으로 언어 모델 후처리가 "이 문맥에서 자연스러운 단어"로 보정합니다.
이 구조를 알면 실패 원인이 눈에 들어옵니다. 결과가 통째로 엉망이면 대개 전처리나 레이아웃 단계에서 이미 망가진 것이고, 대체로 잘 나오는데 특정 글자만 틀린다면 인식 단계의 한계입니다. 그리고 앞 단계의 손상은 뒷 단계에서 절대 복구되지 않습니다. 그래서 OCR 품질의 대부분은 엔진이 아니라 넣는 이미지에서 결정됩니다.
인식률을 결정하는 것은 결국 원본 이미지입니다
해상도: 300dpi가 사실상의 기준선
문서 스캔의 표준은 300dpi입니다. A4 용지를 300dpi로 스캔하면 대략 2480 x 3508 픽셀이 나옵니다. 이 정도면 본문 10pt 글자가 차지하는 세로 폭이 약 40픽셀이 되어 획 하나하나가 살아 있습니다. 같은 문서를 150dpi로 줄이면 그 폭이 20픽셀 언저리로 떨어지는데, 이 구간부터 한글 받침이나 작은 첨자가 뭉개지기 시작합니다. 반대로 600dpi 이상은 파일만 커질 뿐 본문 텍스트에서는 이득이 거의 없습니다. 각주나 도장 안의 아주 작은 글씨, 오래된 인쇄물처럼 획이 희미한 경우에만 400~600dpi를 고려하십시오.
각도: 비스듬히 찍으면 글자가 사다리꼴로 왜곡됩니다
스마트폰으로 책이나 서류를 찍을 때 가장 흔한 실수가 비스듬한 각도입니다. 원근 왜곡이 생기면 같은 줄 안에서도 왼쪽과 오른쪽 글자 크기가 달라지고, 줄 자체가 곡선으로 휘어 레이아웃 분석이 줄을 제대로 잡지 못합니다. 카메라를 문서 정중앙 바로 위에 두고 수직으로 촬영하는 것이 원칙입니다. 두꺼운 책은 펼친 면이 볼록하게 휘므로, 한 번에 두 페이지를 찍기보다 한 페이지씩 눌러 평평하게 만든 뒤 찍는 편이 훨씬 낫습니다.
조명: 밝기보다 균일함이 중요합니다
플래시를 켜면 코팅된 종이에서 정반사가 생겨 그 부분 글자가 통째로 날아갑니다. 형광등 아래에서는 자기 그림자가 페이지 절반을 덮습니다. 창가의 간접광처럼 넓고 부드러운 광원에서, 그림자가 지지 않도록 몸을 비껴 서서 찍는 것이 가장 안정적입니다. 이진화 과정에서 밝은 쪽 글자는 배경으로, 어두운 쪽 배경은 글자로 잘못 판정되기 때문에, 페이지 전체의 밝기 차이가 적을수록 결과가 좋아집니다.
파일 형식과 압축
JPEG는 사진용 손실 압축이라 글자 가장자리에 잔물결 같은 아티팩트를 남깁니다. 품질을 낮게 저장한 스크린샷에서 인식률이 유독 나쁜 이유가 이것입니다. 스캐너로 문서를 저장할 때는 PNG나 TIFF 같은 무손실 형식을, 부득이하게 JPEG를 쓴다면 품질을 최대치로 두십시오. 또한 이미 저해상도로 저장된 이미지를 나중에 확대해도 정보는 늘지 않습니다. 확대는 없는 획을 만들어내지 못합니다.
스캐너 / 복합기
흑백 문서는 회색조 300dpi, 컬러 도장이나 사진이 섞였다면 컬러 300dpi. "문서" 모드가 있으면 그것을 쓰고, 과도한 자동 보정은 끄는 편이 낫습니다.
스마트폰
기본 카메라보다 iOS 메모/파일 앱의 문서 스캔이나 Android의 Google 드라이브 스캔 기능이 유리합니다. 테두리 검출과 원근 보정, 평탄화를 자동으로 해 주기 때문입니다.
화면 캡처
화면을 확대한 뒤 캡처하십시오. 100% 배율 스크린샷은 글자 높이가 12~16픽셀에 불과해 인식이 불안정합니다. 브라우저 확대(150~200%) 후 캡처가 간단하고 확실합니다.
한글 OCR이 유독 어려운 이유
같은 조건에서도 한글은 영문보다 오류가 잘 납니다. 엔진 성능 탓만은 아니고 문자 체계 자체의 특성입니다.
첫째, 후보 글자 수가 압도적으로 많습니다. 영문은 대소문자를 합쳐도 52자지만, 유니코드에 정의된 현대 한글 음절은 11,172자입니다. 실제 문서에 자주 쓰이는 것만 추려도 완성형 기준 2,350자 수준입니다. 모델이 구분해야 할 선택지가 수십 배 많으니 그만큼 헷갈릴 여지도 큽니다.
둘째, 한 글자 안의 정보 밀도가 높습니다. 한글은 초성, 중성, 종성을 네모 하나 안에 쌓아 넣기 때문에 같은 크기라도 획이 훨씬 촘촘합니다. 해상도가 조금만 낮아지면 가장 먼저 무너지는 곳이 받침입니다. "값"이 "갑"으로, "옳다"가 "올다"로 읽히는 식으로 겹받침 한쪽이 통째로 사라지거나, 획이 붙어 버려 "많다"가 "만다"가 되기도 합니다. 영문 대비 더 높은 해상도가 필요한 실질적 이유입니다.
셋째, 획 하나로 갈리는 글자쌍이 많습니다. ㅁ과 ㅇ, ㄷ과 ㅌ, ㅂ과 ㅃ, ㅗ와 ㅛ, ㅜ와 ㅠ는 저품질 이미지에서 서로 자주 뒤바뀝니다. 여기에 한자, 영문 약어, 숫자가 한 문장 안에 섞이는 한국 문서의 특성까지 더해지면 언어 모델의 문맥 보정도 힘을 쓰기 어렵습니다. 세로쓰기 옛 문서나 띄어쓰기가 불규칙한 자료는 난이도가 한 단계 더 올라갑니다.
표와 손글씨: 기대치를 낮춰야 하는 영역
표는 "글자"가 아니라 "구조"의 문제입니다
OCR의 기본 단위는 텍스트 줄입니다. 표를 넣으면 셀 안의 글자는 잘 읽어도 어느 셀이 어느 열에 속하는지는 별개의 문제입니다. 그래서 결과가 열 순서대로 정렬되지 않고 한 줄로 쭉 이어지거나, 셀 하나가 두 줄로 나뉘면서 아래 행과 섞이는 일이 흔합니다. 특히 취약한 경우는 병합된 셀과 괘선이 없는 표입니다. 선이 없으면 경계를 여백만으로 추정해야 하므로 열이 통째로 밀릴 수 있습니다. 표가 핵심인 문서라면 추출 후 반드시 행과 열의 개수, 그리고 합계를 원본과 대조하십시오.
손글씨는 다른 종목입니다
인쇄체 인식과 필기체 인식(HTR)은 접근 방식 자체가 다릅니다. 인쇄체는 같은 글자면 모양이 똑같지만, 손글씨는 사람마다 다르고 같은 사람도 매번 다릅니다. 게다가 흘려 쓰면 글자와 글자가 이어져 어디서 끊어야 하는지부터 불확실해집니다. 한글 흘림체는 자모가 서로 붙어 형태가 크게 변형되므로 난도가 특히 높습니다. 현실적으로 신뢰할 만한 범위는 칸이 나뉜 서식에 또박또박 쓴 숫자나 정자체 정도이며, 자유롭게 쓴 필기 노트는 결과를 초안으로만 쓰고 전면 검수를 전제해야 합니다.
스캔본 PDF에서 텍스트 꺼내기
PDF는 두 종류가 섞여 있습니다. 워드나 한글에서 저장한 텍스트 PDF는 문자 코드를 그대로 담고 있어 OCR이 아예 필요 없습니다. 반면 종이를 스캔한 이미지 PDF는 페이지마다 사진 한 장이 들어 있을 뿐입니다.
구분법은 간단합니다. PDF 뷰어에서 본문 글자를 마우스로 드래그해 보십시오. 선택 영역이 글자 모양대로 잡히면 텍스트 PDF이고, 사각형으로만 잡히거나 아무것도 선택되지 않으면 이미지 PDF입니다. 더 확실한 방법은 문서에 분명히 존재하는 단어를 Ctrl+F(맥은 Command+F)로 검색해 보는 것입니다. 결과가 0건이면 이미지입니다. 텍스트 PDF인데 굳이 OCR을 돌리면 멀쩡한 원본을 추정값으로 바꿔치기하는 셈이니 반드시 먼저 확인하십시오.
이미지 PDF라면 각 페이지를 이미지로 렌더링해 OCR을 적용하게 됩니다. 이때 원본이 이미 저해상도로 스캔되어 있다면 결과의 상한도 거기서 정해집니다. 종이 원본을 다시 구할 수 있다면 300dpi로 재스캔하는 것이 어떤 후보정보다 효과적입니다. 이미지나 PDF를 올려 바로 텍스트를 뽑아보고 싶다면 Utilo 이미지 텍스트 추출(OCR) 같은 웹 도구를 쓰는 것도 한 가지 방법입니다.
추출 결과 검수: 어디부터 봐야 하나
OCR 결과는 전부 다시 읽는 것이 아니라, 틀리기 쉬운 곳과 틀리면 치명적인 곳부터 확인하는 것이 효율적입니다. 문맥 보정이 잘 먹는 일반 문장은 대체로 무사하지만, 문맥이 없는 숫자와 고유명사는 보정을 받지 못해 오류가 그대로 남습니다.
- 숫자와 알파벳의 단골 혼동: 0과 O, 1과 l과 I, 5와 S, 8과 B, 2와 Z, 6과 G. 계좌번호, 사업자등록번호, 송장번호처럼 문맥이 없는 문자열을 최우선으로 봅니다.
- 금액은 자릿수부터 확인합니다. 쉼표가 마침표로 읽히면 1,000이 1.000이 되고, 자릿수 하나가 빠지면 열 배가 틀어집니다.
- 날짜는 연/월/일 순서와 두 자리 표기를 확인합니다. 하이픈이 다른 기호로 바뀌는 경우도 잦습니다.
- 한글은 ㅁ과 ㅇ의 혼동, 그리고 받침 누락을 집중적으로 봅니다. 사람 이름과 회사명, 주소는 사전에 없는 단어라 오류가 그대로 남기 쉽습니다.
- 줄바꿈 처리: 원본에서 줄 끝에 잘린 단어가 두 조각으로 남아 있는지, 문단이 통째로 한 줄로 붙었는지 확인합니다.
- 누락 점검: 원본의 문단 수, 표의 행 수, 페이지 하단 각주가 결과에도 있는지 봅니다. 잘못 읽힌 글자보다 통째로 빠진 영역이 더 위험합니다.
- 합계가 있는 표는 각 항목을 더해 합계와 맞는지 계산해 봅니다. 숫자 오류를 잡는 가장 빠른 방법입니다.
원본 이미지와 결과 텍스트를 화면 좌우에 나란히 띄우고 대조하면 속도가 크게 빨라집니다. 분량이 많다면 최소한 첫 페이지와 마지막 페이지, 그리고 숫자가 몰린 페이지만이라도 전수 검수하십시오.
개인정보가 담긴 문서를 다룰 때
OCR을 쓰는 문서는 신분증, 계약서, 진단서, 급여명세서, 통장 사본처럼 민감한 것이 많습니다. 이미지를 어딘가에 올린다는 것은 그 문서 전체를 외부에 전달하는 행위임을 잊지 마십시오.
- 서비스의 개인정보 처리방침에서 업로드 파일의 보관 여부와 보관 기간, 학습 데이터 활용 여부를 확인합니다.
- 가능하면 브라우저 안에서 처리되어 파일이 서버로 전송되지 않는 방식이나, 오프라인에서 동작하는 도구를 우선 고려합니다.
- 필요 없는 정보는 추출 전에 가립니다. 주민등록번호 뒷자리, 카드번호, 계좌번호는 종이에 붙임쪽지를 덮고 촬영하거나 이미지 편집으로 지운 뒤 처리하는 편이 안전합니다.
- 결과물 관리도 함께 해야 합니다. 다운로드 폴더에 남은 텍스트 파일, 클립보드, 채팅으로 보낸 사본까지가 관리 대상입니다.
- 한국에서 주민등록번호는 법령에 근거가 없으면 수집과 이용 자체가 제한됩니다. 업무용 문서라면 사내 규정과 담당 부서 지침을 먼저 확인하십시오.
- 타인의 문서를 대신 처리할 때는 그 사람의 동의 범위를 넘지 않는지 확인합니다.
OCR을 쓰지 말아야 할 때
마지막으로 가장 중요한 원칙입니다. 원본 파일을 구할 수 있다면 OCR은 항상 차선책입니다. 상대방에게 워드나 엑셀 원본, 혹은 텍스트가 살아 있는 PDF를 요청하는 5분이 OCR 결과를 검수하는 한 시간보다 낫습니다. 웹페이지의 이미지 텍스트도 마찬가지로, 원 게시물에 텍스트 형태로 존재하는 경우가 많습니다.
또한 법적 효력이 있는 계약 조항, 의료 기록, 회계 장부처럼 한 글자의 오류가 실질적 손해로 이어지는 문서는 OCR 결과를 그대로 신뢰해서는 안 됩니다. 이런 문서에서 OCR의 올바른 용도는 "원본을 대체하는 것"이 아니라 검색과 초벌 입력을 돕는 보조 수단입니다. 최종 판단의 근거는 언제나 원본이어야 합니다.
정리하면 순서는 이렇습니다. 원본 파일이 있는지 먼저 확인하고, 없다면 300dpi 이상으로 수직 촬영과 균일한 조명에서 다시 확보하고, 그다음에 OCR을 돌리고, 숫자와 고유명사를 검수하고, 민감정보가 있으면 처리 경로를 점검합니다. 이 순서만 지켜도 결과 품질은 눈에 띄게 달라집니다.
자주 묻는 질문
OCR 인식률이 계속 낮은데 가장 먼저 무엇을 바꿔야 하나요?
해상도와 촬영 각도를 먼저 점검하십시오. 문서 스캔은 300dpi가 기준선이며, 이보다 낮으면 한글 받침처럼 획이 촘촘한 부분이 뭉개져 어떤 엔진을 써도 복구되지 않습니다. 스마트폰 촬영이라면 문서 정중앙 바로 위에서 수직으로 찍고, 플래시 대신 그림자가 지지 않는 넓은 간접광을 쓰십시오. 이미 낮은 해상도로 저장된 이미지를 나중에 확대해도 없는 획이 생기지는 않습니다.
한글은 왜 영어보다 오류가 많이 나나요?
구조적인 이유가 있습니다. 영문은 대소문자를 합쳐 52자인데 반해 현대 한글 음절은 유니코드 기준 11,172자여서 모델이 구분해야 할 후보가 훨씬 많습니다. 또 초성·중성·종성을 한 네모 안에 쌓기 때문에 같은 크기에서도 획이 촘촘해 해상도 손실에 취약합니다. ㅁ과 ㅇ, ㄷ과 ㅌ처럼 획 하나로 갈리는 조합이 많은 것도 오류를 늘리는 요인입니다.
PDF에서 텍스트가 복사되지 않는데 OCR을 돌려야 하나요?
먼저 이미지 PDF인지 확인하십시오. 뷰어에서 본문을 드래그했을 때 글자 모양대로 선택되지 않거나, 문서에 분명히 있는 단어를 Ctrl+F로 검색해 0건이 나오면 스캔된 이미지 PDF이므로 OCR이 필요합니다. 반대로 검색이 되는 텍스트 PDF라면 OCR은 오히려 정확한 원본 텍스트를 추정값으로 바꾸는 셈이니 사용하지 않는 편이 좋습니다.
표가 들어간 문서는 왜 결과가 뒤죽박죽인가요?
OCR의 기본 인식 단위가 텍스트 줄이기 때문입니다. 셀 안의 글자는 잘 읽어도 어느 셀이 어느 열에 속하는지는 별도의 표 구조 분석이 필요하며, 이 과정에서 열이 밀리거나 행이 섞일 수 있습니다. 특히 병합된 셀과 괘선이 없는 표에서 오류가 잦습니다. 표가 핵심인 문서라면 추출 후 행과 열의 개수, 그리고 합계 값을 원본과 반드시 대조하십시오.
신분증이나 계약서를 OCR로 처리해도 괜찮을까요?
이미지를 업로드한다는 것은 문서 전체를 외부에 전달하는 것과 같으므로 신중해야 합니다. 서비스의 개인정보 처리방침에서 파일 보관 여부와 기간을 확인하고, 가능하면 파일이 서버로 전송되지 않는 방식이나 오프라인 도구를 우선하십시오. 필요 없는 항목은 추출 전에 가리는 것이 가장 확실하며, 한국에서 주민등록번호는 법령 근거 없이 수집·이용하는 것 자체가 제한된다는 점도 유의해야 합니다.
관련 도구
이 글에서 설명한 작업은 이미지 텍스트 추출(OCR)에서 설치 없이 바로 처리할 수 있습니다. 파일이 서버로 올라가지 않고 브라우저 안에서 변환됩니다.