대회 끝나니 바로 기말이 시작되어 허겁지겁 기말 프로젝트 하는 중임. 가장 급한게 영상처리 강의라서 그거 기말 프로젝트 먼저 하는 중. 근데 몇가지 생각해 본 아이디어가 다 실제로 해보다보니 영 아니다 싶어 거듭 던져야 했는데, 다행히 이번 아이디어는 나름 성과가 나오는거 같음.


디지털 영상 자막 인식기를 만드는게 목적임. OCR은 아니고, 그냥 영상을 입력 받아 해당 영상에서 자막이 들어 있는 부위만 잘라 추출해 따로 모아놓는 프로그램임. 거기서 텍스트까지 추출하는건 시간이 부족할거 같아 과감히 스킵함.






영상에 자막이 인식 되면 이런 식으로 그걸 잘라냄. 예시는 일부러 좆같은걸 고름. 의외로 인공지능 하나도 안 들어간 순수 영상처리 프로그램임.


방법을 간단히 정리하면 다음과 같음. 자막의 각 글자는 보통 서로와 근접한 위치에 수평으로 나열되어 있음. 그리고 자막은 보통 폰트 그 자체만 해도 픽셀 밝기값(intensity)가 자잘하게 계속 변동이 있는 형식을 띄고, 그 뒤에 깔린 오리지널 영상과 보통 극명한 대비를 보임. 따라서, 영상의 각 행에 푸리에 변환을 가해 주파수 영역으로 바꿀 경우 자막이 위치한 행은 타 행보다 고 주파수 계수가 높게 나오게 됨.




---->




이런 식으로 말이지.


반면 자막이 없는 경우 행 단위로 주파수 변환을 하면 비교적 값이 일관적으로 나오게 됨.




---->




차이가 보일거임. 따라서 나는 이 중 자막이 들어 있는 영상에서 보이는 특징을 더욱 극대화시키기 위해 각 행마다 그에 속한 계수값을 모두 합해 그 행의 모든 항에 다시 그 값을 할당해 넣었고, 정규화 과정을 통해 각 행의 값이 0-255 범위 안에 들어오도록 함.





그러한 과정을 거치면 자막이 포함 된 행이 더욱 두각되어 드러남. 그에 더해 Otsu's method 를 적용해 영상 이진화를 할 수 있고, 수직 커널을 가지고 모폴로지 닫힘 연산과 열림 연산을 이어 수행해 다음 이진영상을 얻어낼 수 있음.





그럼 이게 자막이 들어 있는 행의 위치가 됨. 자막이 들어 있는 영상의 경우 보통 이 단계에서 값을 가진 항의 비율이 값을 가지지 못한 항보다 더 낮음. 대충 10~30% 내외임. 반면, 자막이 들어 있지 않은 영상의 경우 특출나게 두드러지는 부위가 없고, 따라서 정규화->이진화 단계에서 값을 가진 항의 비율이 더욱 높게 나타나게 됨. 보통 55~80% 내외임. 따라서 추가 연산을 수행하기 전에 이 단계에서 그 특징을 이용해 자막 여부를 확인함. 없다고 판정되면 걸러내고, 있다 판정되면 다음 단계로 넘어감.


다음 단계라 해서 크게 대단한건 없음. 그냥 이리 뽑아낸 영역에 대해 같은 연산을 다만 열 단위로 적용해 해당 영역 중 어느 열에 자막이 들어 있는지 판정해내는게 전부임. 다만 순서가 중요한데, 행 단위 연산을 통해 먼저 영역을 뽑아낸 이후 그에 대해 열 단위 연산을 적용해야함. 왜냐면 자막 특성 상 행을 따라 나열해 있기 때문에 행 단위 연산이 더욱 정확하고, 먼저 그를 적용해 영역을 좁히고 나서야 열 단위 연산의 정확도가 쓸만해지기 때문임. 사실 그러고나서도 비교적 정확도가 낮은 편이고 따라서 인식 된 자막의 높이가 딱 맞게 나오는 것과 달리 그 너비는 좀 더 널널하게 잡힘. 부족하게 잡히는 것보다야 그게 더 나아서 좀 널널하게 연산을 수행하기 때문임.


그것 역시 수행하고 나면 다음 이진영상을 얻게 됨.





이 케이스에선 그리 나오지 않았지만, 열단위 연산에서 false positive가 나올 수 있음. 그러면 보통 자막이 위치한 곳 외에도 사각형이 자잘하게 한두개씩 남아있게 됨. 따라서 opencv의 findContours 함수를 통해 모든 외적직사각형을 찾아내고, 그 중 가장 영역이 넓은 직사삭형을 자막이 위치한 영역으로 삼음. 그럼 이제 그 영역만 잘라 출력하면 되고, 그 결과는 다음과 같음.





잘 만든거 같아 뿌듯함.



--------------------------

애니 영상을 누가 댓글에서 언급해주어서 함 그거도 돌려 봄. 고려해보지 못한 경우였음. 돌려보니 나름 잘 인식되는거 같음.





--------------------------------------------------------------------------------

https://github.com/MegasKomnenos/subscanner

깃헙에 올림