본문 바로가기

Computer Vision + Python/영상 처리 & 비디오 분석 (엔지니어)

감성돔 낚시터의 강한 햇빛, 파이썬 그림자 제거(Shadow Removal)로 AI 인식률 높이기

모바일 환경에서 낚시 앱을 테스트하다 벽에 부딪혔다.

지난 주말, 대물 감성돔을 기대하며 낚시터에 나갔다. 직접 개발 중인 AI 낚시 앱으로 잡은 물고기를 촬영해 보려는데, 정오의 강한 햇빛 때문에 생긴 짙은 그림자가 문제였다.

처음에는 OpenCV의 기본적인 필터링만으로도 충분히 그림자를 지울 수 있을 거라 생각했다. 실제로 실내 테스트에서는 아무 문제가 없었으니까. 그런데 막상 현장의 강한 직사광선 아래서 테스트해 보니 생각보다 한계가 분명했다. '이론적으로 완벽한 코드'와 '실제의 변수' 사이에는 꽤 큰 거리가 있었다.


시작하기 전에 예상했던 것과 실제의 차이

문서나 예제만 봤을 때는 구조가 단순해 보였다.

  • 예상: 그림자 영역의 밝기값(Value)만 높여주면 자연스럽게 지워질 것이다.
  • 현실: 밝기만 높이니 그림자 경계면이 하얗게 뜨거나, 물고기의 비늘 색감 자체가 왜곡되어 버렸다. 특히 모바일 기기에서 실시간으로 처리하려니 프레임이 뚝뚝 끊겼다.

이때부터 **“이게 생각보다 쉽지 않구나”**라는 느낌이 들기 시작했다.

강한 정오 햇빛 아래서 촬영한 감성돔 원본사진
강한 정오 햇빛 아래서 촬영한 감성돔 원본사진 짙은 그림자 때문에 물고기의 무늬와 형태가 뭉개져 인식이 불가능한 상태다


실습 과정에서 가장 먼저 막혔던 부분

가장 먼저 시간을 잡아먹은 건 그림자 영역의 정확한 검출이었다. 그림자인지, 아니면 물고기 원래의 검은 무늬인지 구별하는 로직에서 계속 오류가 났다. 이론적으로는 이해하고 있었지만, 실제 수면의 반사광 때문에 결과가 제각각이었다.

그다음은 색상 복원 문제였다. 그림자를 지운 자리가 주변 배경과 어울리지 않고 이질감이 너무 심했다. “한 번만 더 튜닝하면 되지 않을까” 하며 LAB 색공간을 오가며 씨름했지만, 이건 아직도 애매한 부분으로 남아 있다.

디버깅도 쉽지 않았다. 모바일 환경에서는 로그 하나 보는 것도 번거로웠고, 문제가 생겨도 원인을 바로 잡기 어려웠다. 완전히 해결됐다고 말하긴 어렵고, 지금도 상황에 따라 다른 접근이 필요할 것 같다는 생각이 든다.

OpenCV로 추출한 그림자 마스크와 보정 후의 결과
OpenCV로 추출한 그림자 마스크와 보정 후의 결과 이질감을 줄이기 위해 LAB 색공간을 활용해 튜닝을 거친 프로 버전의 출력 화면이다.


왜 이 방식(Python + OpenCV)이었나

왜 굳이 이 조합이었을까. 완벽해서라기보다, 모바일 환경에서 그나마 현실적인 선택지처럼 보였기 때문이다. Python을 선택한 것도 같은 이유였다. 이미 익숙한 환경이었고, 빠르게 테스트해 볼 수 있었다.

누군가에게는 딥러닝 기반의 최신 모델이 더 맞을 수도 있다. 나는 이런 상황이었고, 이런 제약 안에서는 이 조합이 그나마 나았다. 정답이라기보다는 타협에 가까운 선택이었다.


지금 시점에서의 개인적인 정리

이 방식은 빠르게 야외 환경의 노이즈를 제어해 보고 싶은 경우에 나쁘지 않다. 반대로, 극단적인 성능이나 완성도를 기대한다면 다른 접근이 더 맞을 수도 있다.

막상 해보니 기술 선택보다 중요한 건 **“어디까지를 목표로 하느냐”**였다. 낚시터에서의 그 땀 흘리던 경험 덕분에 그림자 제거 알고리즘의 기준을 조금 더 명확히 잡을 수 있었던 건 분명한 수확이었다.


마무리하며

아직도 더 나은 방법이 있을 것 같다는 생각은 든다. 다만 지금 상황에서는 이 선택이 가장 현실적이었다. 이 글이 누군가에게 정답이 되기보다는, 비슷한 고민을 하고 있다면 하나의 참고 경험 정도로 읽히면 좋겠다.