WPF OpenCV 프로젝트 #21: Improve Histogram Bug (히스토그램 버그 개선)


Histogram Bug 를 이번 글에서는 개선하여 WPF OpenCV 프로젝트를 업데이트 하겠습니다.
지난 포스팅(#20) 마지막에 제가 이렇게 글을 쓰고 마무리했었죠. “다음에는 영상의 기하학적 변환(이동, 회전, 확대/축소)을 다루겠습니다!” 라구요.

하지만… 제가 포스팅 된 내용을 읽고 계신 분들께 알리지 않고 은근슬쩍 모른 척 넘어가려던 버그가 하나 있었습니다. 댓글이 없어서 ‘아무도 모르거나, 알아서들 고쳤으리라~’ 하고 묻어두려 했지만, 다음 글을 작성하면서도 양심상 도저히 마음이 편치 않아 자수하고 가려고 합니다. (죄송합니다! 😭)

기하학적 변환은 다음 포스팅으로 아주 잠깐만 미루고, 오늘은 히스토그램 기능의 치명적인 버그를 먼저 잡고 가겠습니다.

Bug 증상

혹시 지난 포스팅(#17)을 읽고, 잘 따라서 히스토그램 기능을 구현하신 뒤, 실행해 보셨나요? 이미지를 불러오고 Histogram 알고리즘을 선택하고, 실행 하면 다음과 같은 황당한 화면을 보지 않던가요?

Histogram Bug 이미지

“어라? 내 원본 이미지는 어디 가고 그래프가 왜 저기 있어?”

정상적으로 실행되었다면:

  1. 팝업 창: 히스토그램 그래프가 떠야 함 (정상)
  2. 메인 화면(ImgView): 원본 이미지(또는 이전 처리 이미지)가 그대로 유지되어야 함

하지만 실제로는 메인 화면의 원본 이미지가 사라지고, 검은 배경의 그래프 그림으로 덮어 씌워지는 현상이 발생했습니다. 근데 아무도 댓글이 달리지 않아 얼렁뚱땅 넘어가버리려 했습니다. 그런데 계속 마음이 편하지 못하더군요. 그래서 이 버그(bug)를 수정하고 가기로 맘 먹었습니다. 불편을 주었다면 다시 한번 미안한 마음을 전합니다.

Root Cause (원인 분석)

범인은 바로 OpenCVService.csProcessImageAsync 함수 안에 있었습니다.

히스토그램 분석 로직을 짤 때, 그래프를 그리기 위해 결과 이미지 변수인 _destImage에다가 그래프를 열심히 그렸습니다. 그런데 이 함수가 끝날 때, _destImage를 UI에 보여주는 변수(_cachedProcessed)로 업데이트해버리는 것이 문제였습니다.

즉, “분석만 하고 조용히 팝업만 띄워야 하는데, 분석하면서 쓴 낙서장을 메인 화면에 걸어버린 셈”입니다.

Solution (해결 방법)

이 문제를 해결하려면 로직을 다음과 같이 수정해야 합니다.

  1. 화면 갱신 제어: Histogram(히스토그램) 분석일 때는 메인 화면을 업데이트하지 않도록 플래그(Flag)를 하나 만듭니다.
  2. 이미지 보존: 히스토그램일 때는 _destImage를 새로 만들거나 덮어쓰지 않고, 팝업용 데이터만 계산하도록 합니다.

자, 수술 들어갑니다! OpenCVService.cs를 열어주세요.

ProcessImageAsync 함수 전체를 아래 코드로 교체하거나, 주석을 보고 수정된 부분만 반영해 주세요. (주요 변경 점은 updateDisplayImage 변수와 Histogram 의 Case 구문 내부입니다.)

위 코드를 정리하면 이렇습니다.

  1. updateDisplayImage 플래그 추가: ProcessImageAsync 시작 부분에 bool updateDisplayImage = true; 를 선언했습니다.
  2. 초기화 로직 분기: Histogram일 때는 _destImage를 초기화(원본 복사)하지 않도록
    if (algorithm != “Histogram”) 조건을 추가했습니다.
  3. Histogram 케이스 수정:
    updateDisplayImage = false;로 설정하여 마지막에 화면 갱신을 막았습니다.
    그래프 이미지를 _destImage에 그리는 부분을 삭제했습니다.
    (이제 팝업 창에서만 그래프를 보여줍니다.)

버그 수정 확인

이제 빌드 후 다시 실행해 보겠습니다. 이제 알고리즘 검증 대상이 되는 원본 이미지를 로드하고, Histogram 알고리즘을 선택 후 실행해도 메인 화면에는 원본(또는 작업 중인) 이미지가 얌전히 남아 있고, 그래프는 팝업 창에만 예쁘게 뜨는 것을 확인할 수 있을 겁니다.

히스토그램 버그 수정 실행 이미지

불편을 드려 죄송합니다. (하지만 이렇게 버그를 잡으면서 또 하나 배우는 거 아니겠습니까? ㅎㅎ)

이제 마음의 짐을 조금 덜었으니, 다음 포스팅에서는 진짜로 영상의 기하학적 변환(Geometric Transform)을 가지고 정리하고 구현해 보도록 하겠습니다. 이미지를 돌리고, 늘리고, 줄이는 재미있는 기능을 구현할 예정입니다.

참고 자료

[Post #17] 히스토그램 구현: [WPF OpenCV Project #17] – 히스토그램 분석 및 그래프 그리기 (버그 수정 전 원리)
[Post #18] 정규화(Normalize): [WPF OpenCV Project #18] – 정규화 구현

댓글 남기기