본문 바로가기
Matlab

[이미지처리] 2. 이미지에 각종 효과 적용하기 (Conv2, Spatial filter; Gamma, Blur)

by 두재 2019. 6. 10.

 

이미지 처리에는 공간 필터라는 것이 존재합니다. 이번 글에서는 Convolution에 대해 잠깐 소개를 하고 2차원 Convolution에 대해 알아본 후, 매트랩에서 이를 사용해 볼 것입니다.


음성 신호를 필터를 씌우듯이 이미지에도 필터가 존재하는데, 이 필터는 신기하게도 2차원 배열의 모양으로 존재합니다. 음성 신호를 필터를 씌울 때에는 Convolution(합성곱이라고 쓰나, 한글로는 잘 안씀)이라는 과정이 존재합니다. 잠깐 짚고 넘어가자면, 음성 신호와 필터의 주파수 응답이 존재하면, 시간축(Time Domain)에서 생각할 때 두 신호 중 하나를 뒤집어 곱하며 적분을 하고, 이를 Convolution이라고 부릅니다. 또한 이를 주파수 영역(Frequency Domain)에서 라플라스 혹은 푸리에 변환을 통하여 본다면, 단순히 Multiplication을 통해서 결과를 찾을 수 있습니다(물론 이 결과는 역라플라스 혹은 역푸리에 변환을 거쳐야 실제 시간축에서의 신호가 되겠죠). 아래 사진을 참고하시면 좋을 것 같습니다.

공대에서는 Convolution에 대해 수없이 많이 나올텐데, 개념 잡기가 어려울 수 있습니다. 댓글 달아주시면 최대한 친절히 알려드릴게요.

시간축(Time Domain)에서의 합성곱(Convolution)
라플라스, 푸리에를 통하여 주파수에서 볼 경우 단순히 곱(Multiplication)을 통해 계산

 

여기까지가 음성에서의 Convolution입니다. 시간 축에서 볼 경우, 필터를 뒤집어 곱하여 적분한다는 점이 핵심입니다. 물론 연속 함수가 아니라면 하나하나씩 곱해서 시그마를 통해 합을 구합니다.


이미지에서의 Convolution에 대해 생각해봅시다. 

지금 우리가 다룬 신호는 x축이 있고, 그에 따른 Magnitude가 y축에 있습니다. 이미지는 x축, y축이 변수로 있고 그에  따른 RGB 신호의 Magnitude (픽셀값)가 z축에 있다고 볼 수 있습니다. 즉, 우리가 1차원을 다뤘다면 이제는 2차원 신호가 입력되는 것이죠. 2차원에서 convolution도 똑같이 하면 되는데, 2차원이기 때문에 convolution하는 filter도 2차원입니다.

아래 그림은 2차원에서 convolution 하는 법을 한 단계, 한 단계씩 나타낸 것입니다. 그림에서 원본 이미지는 아래의 6*6 행렬이고, 필터는 3*3입니다. 결과는 시간에서 convolution했을 때와 마찬가지로 행렬의 길이는 길어지고, (6+3-1)*(6+3-1)이 되겠죠.

필터가 왼쪽에서 오른쪽으로, 위에서 아래로 한칸씩 이동하면서 겹치는 부분의 각 원소끼리 곱해서 새로운 배열에 저장합니다.
이렇게 계속 하다보면 새로운 배열이 만들어지겠죠.


이미지에서 convolution에 대해 알았으니 매트랩에서 사용하는 법을 알아봅시다. 매트랩에서는 conv2라는 함수를 통하여 두 개의 배열을 입력받아 2차원 convolution을 돌리고 결과를 출력합니다. 물론 사실 직접 필터를 만들고, Convolution을 돌리지 않더라도 매트랩은 이미지에서도 이미 기본 함수들이 내장되어 있습니다. 이미지를 여러 가지로 직접 매트랩에서 조작하면서 알아보도록 합시다. 매트랩에서 이미지를 불러 들이고, 어떻게 이미지를 처리하는지에 대해 모르신다면 아래 게시물을 참고하시기 바랍니다.

2019/06/09 - [Matlab] - [이미지처리] 1. 이미지 파일(.jpg) 읽고 다루기

 

[이미지처리] 1. 이미지 파일(.jpg) 읽고 다루기

매트랩에서는 음성뿐 아니라 이미지 파일에 관한 수많은 함수들이 존재합니다. 함수들에는 이미지 읽기, 쓰기, 회전, 크기 변환 등이 있습니다. 어차피 매트랩에서 이미지를 행렬을 생각하기 때문에 행렬에서 할..

honeyjamtech.tistory.com

 

 

1. Gamma Transform

감마 조절, 감마 보정, 감마 교정 (Gamma correction)으로 불리는 이 변환은 지수함수를 이용합니다. 

위 식이 감마 보정의 식입니다. s가 결과값, c는 전체적인 scale을 조절하기 위한 상수, r은 입력(원 신호)이고 마지막으로 감마에 따라서 결과값이 커지느냐, 작아지느냐가 결정됩니다. c가 1이라 할 때 감마가 1이면 입력과 출력이 같고, 감마가 1보다 크면 전체적으로 신호가 커지고 1보다 작으면 작아지겠죠. 그리고 이게 이미지에서 적용된다면 전체적인 밝기를 밝게 하거나 어둡게 조절할 수 있습니다.

실제로 디스플레이 관련 글을 읽거나 모니터를 만져보시면 감마값 조절이라는 항목이 있거나, 감마값을 잘 조절하라는 걸 보거나 들으신 적이 있을 것입니다. 이 감마를 잘 조절하여 밝기를 전체적으로 조절할 수 있다는 것입니다.

감마값이 무엇이냐에 따라 지수 함수로 입력에 대해 출력이 변하는 것을 볼 수 있습니다.

매트랩에서는 저 식을 사용하여 구현할 수 있습니다.

gamma = 1.2;
G1 = uint8(double(img).^gamma);
imshow(G1)

gamma = 0.8;
G2 = uint8(double(img).^gamma);
imshow(G2)

G1은 감마값을 1.2로 했으니 더 밝아질 것이고, G2는 0.8이니 더 어두워지겠죠? 결과를 보여드리겠습니다.

원본이미지(좌), Gamma=1.2(중앙), Gamma=0.8(우)

원본 이미지가 첫 사진이고, 두 번째 사진은 너무 밝아졌고, 세 번째 사진은 너무 어두워진 것을 확인할 수 있습니다. 이 감마값을 적절히 조절한다면, 최적의 밝기로 사진을 조절할 수 있을 것입니다.

 

2. Blur (Low pass filter)

다음은 블러 효과입니다. Blur 효과란 흐릿하게 만드는 것을 의미하고 사진에서 빠르게 변화하는 먼지, 나무 무늬, 눈썹 등의 정보(고주파 정보)를 날리는 것이므로 이미지에서의 저주파 통과 필터(Low pass filter, LPF)라고 생각할 수 있습니다. 여기서는 아까 살펴보았던 Conv2를 사용할 것입니다. 우선 filter를 만드는 것부터 시작합니다.

f1 = [0 0 1 0 0 ;
      0 1 2 1 0 ;
      1 2 4 2 1 ;
      0 1 2 1 0 ;
      0 0 1 0 0 ]/(1*8+2*4+4);
f2 = ones(5)/25;

이 두 필터 모두 LPF인데, 조금 설명을 덧붙이자면,

f1은 5*5의 면적에 있는 정보들을 더해서 나누는데, 중앙에 가중치를 더 준 것으로 LPF이지만 조금 LPF의 효과는 떨어질 것입니다.

f2는 5*5의 모든 칸이 1/25로 일정하여 LPF가 제일 효과가 클 것입니다. 이 두 필터를 직접 통과시켜보겠습니다.

R = conv2(img(:,:,1), f1);
G = conv2(img(:,:,2), f1);
B = conv2(img(:,:,3), f1);
fin = cat(3,R,G,B)

conv2는 2차원 행렬과 2차원 행렬끼리 가능한데, 사진이 R, G, B 3개의 채널로 인해 현재 3차원이기 때문에 각각의 채널마다 따로 conv2를 해줘야 합니다. 그래서 위처럼 ( : , : , 1) 이라는 문법으로 따로 떨어뜨릴 수 있고, 나중에 cat을 통해 다시 3차원 행렬로 합칠 수 있습니다.

고 결과를 확인해보도록 하겠습니다.

 

원본 이미지(좌), f1을 통과시킨 후(중앙), f2를 통과시킨 후(우)

스피커의 천 질감이나 먼지 뒤의 나무 배경에 집중하여 보시면 blur 효과가 일어난 것을 잘하면? 확인 가능하실 겁니다. 좀 더 구분을 위하여 확대를 해보았습니다.

원본 이미지(좌), f1을 통과시킨 후(중앙), f2를 통과시킨 후(우)

먼지와 스피커의 조직을 확대하여 보았는데, 차이가 느껴지시죠. 왼쪽에서 오른쪽으로 갈수록 Blur의 효과가 강해지는 것을 볼 수 있습니다. 

 


1차원과 2차원에서의 Convolution을 알아보고 Matlab에서 직접 함수를 사용하여 감마 보정(Gamma correction)을 하고, 직접 filter를 만들고 conv2를 통하여 이미지에 변화를 주는 과정을 살펴보았습니다.