2017-12-01 40 views
0

TV 영상의 자막에 대해 OCR을 적용하고 있습니다. (나는 Tesseact 3.x w/C++을 사용하고 있습니다.) 텍스트와 배경 부분을 OCR의 전처리로 분리하려합니다.OCR 전처리를 위해 이미지에서 노이즈와 텍스트를 분리하는 방법

여기서 원 화상이다 :

enter image description here

그리고, 전처리 된 이미지 :

enter image description here

문자 인식 결과이다 Sicemn 클론

상기 전처리 된 이미지가 도시 된 바와 같이, OCR 모듈이 j를 수행하지 못하도록 문자 주위에 남아있는 "안개"가 있습니다. ob 제대로.

"안개"를 프로그램 적으로 제거하거나 사전 처리 된 이미지에서 이미지를 제거/축소 할 수있는 이미지 처리를 인식하는 방법이 있습니까?

전처리 로직이 많이 다른 이미지를 처리하도록 최적화되어 있기 때문에, 차라리에 "깨끗한"전처리 된 이미지 사전 처리 로직을 수정하는 것보다 (이 사진에 최적화 이후 다른 사진에 영향을 미치는 수있는) 방법

를 찾으려면 어떤 제안이라도 대환영입니다.


업데이트 분명히, sixela의 대답은 중대하다, 케이스의 대부분 작동합니다. 결과

enter image description here

예 : 겉으로

enter image description here

, 가우스가 작동하지 않습니다 이 사건은 배경도 작동하지 않는 경우의

예 텍스트와 유사한 색상을 포함입니다 필터가 이러한 유형의 푸티 지에서 문제를 일으키는 것으로 보입니다. 다른 푸티지를 사용하려면 다른 접근 방식이 필요합니다.

+0

캡션 것 같은 여러 연속 프레임 동안 백그라운드 변경 남아있다. n 프레임 동안 변경되는 픽셀과 거의 동일한 픽셀을 분할 할 수 있습니다. 그것은 완벽하지는 않지만 많은 경우에 도움이 될 수 있습니다. –

+0

안녕하세요 애드리안, 귀하의 조언을 주셔서 감사합니다. 예, 저는 이미 OpenCV에서 absdiff와 MOG 필터를 사용하여 그 방법을 시도했습니다. 일반적인 장면에서 프레임의 오브젝트가 너무 빨리 움직이지 않기 때문에 잘 작동하지 않습니다. 자막이 사람 위에 겹쳐있는 경우 너무 빨리 움직이지 않지만 자막은 1-2 초 동안 만 나타납니다. 차 체이스 장면이라면, 그것은 효과가있을 것입니다 .. – Aki24x

답변

1

형태 학적 작업과 임계 값을 사용하여 더 명확한 (완벽하지는 않은) 이미지를 얻을 수있었습니다.여기

는 방법입니다

  1. 내가 그레이 스케일
  2. 에서 원본 이미지를 변환하여 시작 그레이 스케일 이미지
  3. 모자 형태 학적 연산 (3 × 3 커널) 노이즈 제거하기 위해 가우시안 블러 (9 × 9 커널)을 적용 흰색 텍스트를
  4. 오츠 thresholding 방법
  5. 팽창을 얻을 수
  6. 얻가 반전 진 임계 값 블랙

에 흰색 텍스트가 드디어 다음 이미지

OCR 결과로 제공

enter image description here

,이 텍스트를 얻을 : "vou don'k 이후"

PS : 물론이 결과는 매개 변수 (예를 들어 커널 크기)를 조정하여 향상시킬 수 있지만 여러분을 안내 할 수 있기를 바랍니다. 필자는 Python에서 OpenCv를 사용하여 이러한 방법을 빠르게 시도했습니다.

import cv2 

image = cv2.imread('./inputImg.png', 0) 
imgBlur = cv2.GaussianBlur(image, (9, 9), 0) 
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) 
imgTH = cv2.morphologyEx(imgBlur, cv2.MORPH_TOPHAT, kernel) 
_, imgBin = cv2.threshold(imgTH, 0, 250, cv2.THRESH_OTSU) 

imgdil = cv2.dilate(imgBin, kernel) 
_, imgBin_Inv = cv2.threshold(imgdil, 0, 250, cv2.THRESH_BINARY_INV) 

cv2.imshow('original', image) 
cv2.imshow('bin', imgBin) 
cv2.imshow('dil', imgdil) 
cv2.imshow('inv', imgBin_Inv) 

cv2.imwrite('./output.png', imgBin_Inv) 
cv2.waitKey(0) 

이 후 이런 명령 정팔 포체의 출력 이미지를 시도 :

tesseract output.png stdout 
+0

놀라운! 소스 코드를 게시 할 수 있습니까? 파이썬도 사용하므로 정말 도움이 될 것입니다! – Aki24x

+0

안녕하세요, 저는 소스 코드로 초기 게시물을 편집했습니다. 시간이 있다면 더 나은 출력 이미지를 얻기 위해 코드를 개선하려고 노력할 것입니다. – sixela

+0

안녕하세요 sixela, 위대한 게시물 주셔서 대단히 감사합니다. 테스트가 더 진행되는 동안 Gaussian w/Morphology 메서드로는 작동하지 않는 푸티지를 발견했습니다. (새로운 영상을 포함하도록이 게시물을 업데이트했습니다.) 대체 방법을 찾기 위해 영상을 살펴 보려고합니다. 그러나 어떤 생각이나 단서가 있다면 알려주십시오. – Aki24x