코딩재개발 RSS 태그 관리 글쓰기 방명록
2018-01-11 13:59:56

mean subtraction and contrast normalization (MSCN)은 Difference of Gaussian (DoG), Laplacian of Gaussian (LoG), Gradient Magnitude (GM)와 같은 이미지 전처리 방식 중에 하나이다. 눈에 보이는 것과 우리 뇌에서 이미지를 처리할 때는 분명 다를 것이기 때문에 영상처리를 위해서는 이러한 전처리 과정이 필요하다. DoG, LoG, GM과 같은 전처리들은 이미지의 엣지 부분을 도드라지게 하는 방법들이다. 이때 시각적으로 그다지 중요하지 않은 부분들은 약화된다. MSCN도 역시 이미지의 불필요하게 반복되는 부분들을 제거하면서, 중요한 부분을 비선형적인 방식으로 남겨준다. 


좀더 심화된 이해를 위해 MSCN에 대한 논문들을 읽어보았다. 아래는 중요하다고 생각한 내용들을 옮겨 적은 것이다. 



나는 도대체 왜 이미지에 전처리과정으로 MSCN을 시행하고, 어떤 생리학적 근거로 시행하는 것이며, 어떤 효과를 주는지에 대해서 알고 싶었다. 위의 논문들을 읽어가며 나름대로 내린 결론은 아래와 같다.  


대부분의 2D 이미지에서 각 픽셀의 값은 이웃하고 있는 픽셀들과 크게 상관성을 갖는다. 즉, 각 픽셀의 값은 이웃 픽셀값과 비슷하거나 종속적이다. 따라서 이미지 내에 불필요하게 중복되는 정보가 꽤 많다. 우리의 눈은 시공간적으로 중복되는 정보는 뇌로 보내지 않는다. 만약 다 보내면 뇌에서 처리해야할 양이 너무 많아지기 때문이다. 이러한 불필요한 중복(redundancy)를 제거해주기 위한 과정이 필요하다. 그것을 모방한 것이 바로 MSCN이다. 일단 각 픽셀에서 주변 픽셀들(자신을 포함)의 평균값을 빼준다. 그리고나서 주변 픽셀들의 표준편차값으로 나눠준다. 이러한 방식으로 각 픽셀값들은 뇌에서 처리하게 좋게 표준화된다. 흥미롭게도 이 과정을 거치면 특별한 규칙이 없었던 이미지의 히스토그램이 가우시안 형태로 변화된다. MSCN은 생리학적 현상을 잘 모델링하고 연산에 있어서도 간단하기 때문에, 많은 이미지 처리 분야에서 이미지의 전처리를 위해 널리 사용되고 있다. 



▶ MSCN 코드 분석


MSCN 코드 

function [MSCN_img]= MSCN(img)

    

    window = fspecial('gaussian',7,7/6); 

    window = window/sum(sum(window));

    

    mu = filter2(window, img, 'same');

    mu_sq = mu.*mu;

    

    sigma = sqrt(abs(filter2(window, img.*img, 'same') - mu_sq));

    imgMinusMu = (img-mu);

    MSCN_img =imgMinusMu./(sigma +1);

    

end


코드 분석:

1. 먼저 가우시안 커널(필터 사이즈 7x7, 표준편차 7/6)을 만든다. 

2. 그 커널과 이미지를 컨볼루션한다. 그렇게 함으로 각 픽셀마다 지역 평균값을 찾아낸다. 엄밀히 말하면 가중평균. 

3. 그리고 각 픽셀마다 지역 표준편차값을 찾아낸다. 

4. 픽셀마다 (픽셀 밝기값 - 픽셀 지역 평균)/픽셀 지역 표준편차로 표준화를 해준다. 

끝! 



▶ MSCN 코드 실행 결과


총 4장의 이미지에 대해서 MSCN을 실행한 결과 이미지들과 그들의 히스토그램을 그림1-4에서 확인하자. 


그림1. local mean subtraction and divisive normalization 전 후 이미지와 그에 상응하는 히스토그램들.


그림2. local mean subtraction and divisive normalization 전 후 이미지와 그에 상응하는 히스토그램들.


그림3. local mean subtraction and divisive normalization 전 후 이미지와 그에 상응하는 히스토그램들.


처리 전 이미지의 히스토그램을 보면 이미지의 내용에 따라 각양각색인데, 처리 후에는 모두 가우시안 분포를 따름을 알 수 있다. 

* 글을 읽던 중에 궁금했던 부분은 질문해주세요.
* 칭찬, 지적, 의문, 격려, 감사표현 등을 남겨주세요.
* 최대한 답변 드리도록 노력하겠습니다.
* 욕설과 광고를 담은 댓글은 가차없이 삭제합니다.
* 티스토리 회원인데, 로그인이 풀린 경우에는 우측 상단에 있는 물음표 아이콘을 클릭해주세요.
비밀글
  1. 초짜@2020.06.10 14:13 ~$ 마지막 histogram 그릴때 x축과 y축의 값은 어떤 것을 의미하는건가요? 관련되어 코드도 혹시 알 수 있을까요?
    논문을 읽고 직접 확인하는 중에 이해가 되지 않아 열심히 검색하다 찾아왔습니다 ㅠ 답변 주시면 감사하겠습니다 [댓글주소]  [수정/삭제]  [답글작성]
    • 코딩재개발@2020.06.10 14:16 신고 ~$ [답글]: x축은 mscn 처리된 픽셀값이고 y축은 그 값을 가진 픽셀의 갯수라고 보시면 됩니다.^^ [댓글주소]  [수정/삭제]
    • 초짜@2020.06.10 14:44 ~$ [답글]: 빠른 답변 감사합니다! 추가적으로 gaussian blur 처리시에 왜 7./6.으로 x deviation을 주는지 알 수 있을까요? 논문에서는 3 표준편차로 샘플했다고 나오는 것으로 봤습니다 ㅠ
      이 분야는 처음 접해봐서 질문이 적절했는지도 모르겠네요 감사합니다.. [댓글주소]  [수정/삭제]
    • 코딩재개발@2020.06.10 14:51 신고 ~$ [답글]: 아 그건 원래 논문에서처럼 3, 3으로 설정하셔도 되요. ㅎㅎ 이 예제에서만 저렇게 설정한 것일 뿐입니다.
      window = fspecial('gaussian',3, 3); 로 쓰시면 논문에서와 같습니다.^^ [댓글주소]  [수정/삭제]
    • 초짜@2020.06.10 15:10 ~$ [답글]: 답변 감사합니다 ㅠ 덕분에 많이 배워 갑니다 ㅠ 좋은 글이 많은 거 같아요 다시 방문하겠습니다 [댓글주소]  [수정/삭제]
    • 코딩재개발@2020.06.10 15:12 신고 ~$ [답글]: 감사합니다. 자주 방문해주세요^^ [댓글주소]  [수정/삭제]