Python HOW : OpenCV를 사용한 OCR 용 이미지 처리

광학 문자 인식 API를위한 이미지 준비

출처 : 저자

이미지에 임의의 노이즈, 고르지 않은 조명, 전면 개체의 구멍 등이있는 경우 컴퓨터 비전 API에 이미지를 게시하기 전에 수행 할 수있는 작업이 거의 없습니다. 이 기사에서는 OpenCV를 사용하여 OCR 결과를 향상시키는 몇 가지 처리 기술을 살펴 봅니다.

TL; DR : 전체 코드

OpenCV 설치

선호하는 패키지 관리자를 사용하여 OpenCV 설치

이미지 읽기

제가 가장 좋아하는 중 하나의 1 판 표지를 예로 들어 보겠습니다. 하자 먼저 지정 이미지를 읽은 컬러 타입 에 이미지를 . 이것은 BGR (Blue-Green-Red) 인 OpenCV의 기본 색상 형식으로 이미지를 읽습니다 . 그런 다음 색상 공간을보다 일반적인 RGB 순서 (및 시각화 용)로 변환하고 마지막으로 보간없이 이미지를 표시하는 작은 함수를 작성합니다.

원본 : 이미지 모양 : 1360H x 1036W x 3C

이미지 자르기

대부분 텍스트 주위에 상자 좌표가 있거나 (라벨링 도구에서) 이미지의 일부에만 관심이 있습니다. 우리의 이미지는 3D numpy배열입니다. 자르려면 높이와 너비를 따라 자르면됩니다.

잘림 : 이미지 모양 : 580H x 900W x 3C

테두리 추가 (예 : 패딩) ( doc )

문서에 대해 학습 된 OCR 모델 이있는 API에 유용 할 수 있습니다 (문서에는 일반적으로 흰색 테두리가 있음).

왼쪽 : 잘린 이미지 모양 : 580H x 900W x 3C. 오른쪽 : 패딩으로 잘림 이미지 모양 : 600H x 920W x 3C

이미지 크기 조정 ( doc )

API에는 입력 이미지에 대한 최대 크기가 있습니다. 이미지의 크기를 조정해야하는 경우 가로 세로 비율을 유지해야합니다.

형태 적 연산 적용 ( doc )

다양한 형태 적 작업에 대해 자세히 알아 보려면이 튜토리얼을 확인하십시오 . 아래 기능은 다음 중 하나에 적용됩니다.

  • 노이즈 제거에 유용한 개방 (침식 후 5 x 5 커널을 사용하여 팽창)
  • 닫기 (확장 후 5 x 5 커널을 사용하여 침식) , 전경 개체 내부의 작은 구멍 또는 개체의 작은 검은 점 을 닫는 데 유용 합니다.

왼쪽 : 원본 가운데 : apply_morphology (img, 'open') 오른쪽 : apply_morphology (img, 'close')

이미지 블러 링 (일명 평활화)은 저역 통과 필터 커널 (이 경우 가우시안)과 컨 볼빙하여 이미지에서 고주파 콘텐츠 (예 : 노이즈)를 제거하는 데 유용합니다 . 더 큰 커널은 더 많은 흐림 효과를 가져옵니다. 이미지 평활화 기술에 대해 자세히 알아 보려면이 자습서를 확인하십시오.

왼쪽 : 원본 가운데 : ksize = (5, 5) 오른쪽 : ksize = (11, 11)

다이빙 임계 값 적용 ( doc )

임계 값은 회색조 이미지를 이진 이미지로 변환합니다 . 적응 형 임계 값은 이미지가 서로 다른 영역에 대해 서로 다른 임계 값을 계산하기 때문에 서로 다른 영역에서 서로 다른 조명 조건을 가질 때 유용 합니다. 이미지 임계 값 기술에 대해 자세히 알아 보려면이 자습서를 확인하십시오.

아래 함수는 다음 두 가지 방법 중 하나를 사용하여 적응 형 임계 값을 적용합니다.

  • 가우스 : 임계 값은 가중치가 가우시안 창인 인접 값의 가중치 합입니다.
  • 평균 : 임계 값은 주변 지역의 평균입니다.

왼쪽 : 원본 가운데 : apply_adaptive_threshold (img, 'gaussian') 오른쪽 : apply_adaptive_threshold (img, 'mean')

소벨 연산자는 가우스 평활화 및 미분 (x 또는 y를 따라 이미지의 1 차 도함수 )을 결합합니다. 수평 또는 수직 가장자리를 감지 하는 데 유용하며 노이즈에 강합니다 . 수평 및 수직 모서리를 모두 감지하기 위해 x와 y를 따라 별도로 필터를 적용한 다음 결과를 추가 할 수 있습니다. Sobel 파생 상품에 대해 자세히 알아 보려면이 튜토리얼을 확인하십시오.

왼쪽 : 원본 오른쪽 : apply_sobel (img, 'h') + apply_sobel (img, 'v')

라플라시안 필터 적용 ( doc )

Sobel 연산자와 유사하게 Laplacian 연산자는 미분을 사용하지만 x와 y를 따라 이미지의 2 차 도함수를 사용합니다 (Sobel 연산자를 사용하여 계산 된 두 번째 x 및 y 도함수를 내부적으로 더함). 라플라시안 연산자는 가장자리 (및 2 차 도함수가 0 인 다른 의미없는 위치 를 감지 하는 데 유용 하므로 필요한 경우에만 적용해야 함) . Laplacian 도함수에 대해 자세히 알아 보려면이 튜토리얼을 확인하십시오.

왼쪽 : 원본 오른쪽 : apply_laplacian (img)

부호화

마지막으로, 이미지의 여러 영역에 대해 여러 개의 상자 좌표가있는 경우 (예 : 제목, 부제목, 작성자 등에 주석을 달기 위해 레이블 지정 도구를 사용 했음) 각 영역 자르기> 저장 로컬에서 잘라낸 이미지> 로컬 이미지를 사용하여 API에 요청을 게시합니다. 이로 인해 파이프 라인이 느려집니다.

이를 해결하려면 대신 각 영역 자르기> 잘린 이미지를 메모리 버퍼로 인코딩 > 메모리 버퍼의 이미지를 사용하여 요청을 게시 할 수 있습니다 . 이것은 첫 번째 접근 방식보다 빠릅니다.

아래는 이미지를 버퍼로 인코딩 한 다음 버퍼를 사용하여 OCR 요청을 위해 데이터를 준비하는 방법 (필요한 경우 이미지를 다시 디코딩하는 방법)을 보여줍니다.

다음은 무엇입니까?

다음 기사 (출시 예정)에서는 다음을 다루는 실용적인 예를 살펴 봅니다.

  • 오픈 소스 라벨링 도구를 사용하여 이미지 라벨링
  • 라벨링 출력 파일을 구문 분석하여 지역별 상자 좌표를 가져옵니다.
  • Azure Computer Vision OCR에 API 요청 보내기
  • 실제 진실에 대한 API 응답 검증

Suggested posts

N + 1 문제 선택

모든 것은 비용이 있습니다.

N + 1 문제 선택

개발자의 경우 ORM (Object-relational mapping)을 사용하면 삶을 상당히 단순화 할 수 있지만 알아야 할 자체 캐치 세트가 있습니다. 더 심각한 문제 중 하나는 Select N + 1 문제입니다.

정규식을 사용한 문자열의 패턴 일치.

정규식을 사용한 문자열의 패턴 일치.

정규식 또는 정규식은 축약 된 형식 언어로 작성됩니다. 일반적으로 정규식은 소스 데이터가있는 정규식 프로세서에 제공하는 패턴으로 생각할 수 있습니다.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.