Skip to content
Home » 이미지 주파수 분석 | 5분만에 이해해보는 푸리에 변환 빠른 답변

이미지 주파수 분석 | 5분만에 이해해보는 푸리에 변환 빠른 답변

당신은 주제를 찾고 있습니까 “이미지 주파수 분석 – 5분만에 이해해보는 푸리에 변환“? 다음 카테고리의 웹사이트 https://hu.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://hu.taphoamini.com/photos. 바로 아래에서 답을 찾을 수 있습니다. 작성자 공돌이의 수학정리노트 이(가) 작성한 기사에는 조회수 24,167회 및 250822 Like 개의 좋아요가 있습니다.

이미지 주파수 분석 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 5분만에 이해해보는 푸리에 변환 – 이미지 주파수 분석 주제에 대한 세부정보를 참조하세요

어때요 참 쉽쥬?
한국어 자막이 제공됩니다.

이미지 주파수 분석 주제에 대한 자세한 내용은 여기를 참조하세요.

이미지와 주파수 관계

간단한 위와 같은 주기가 있는 이미지를 실제 영상과 계산하여 어떠한 결과를 얻는데 그것을 이미지에서 주파수 이미지 라고 합니다. 이유는 주파수 …

+ 여기에 자세히 보기

Source: idlecomputer.tistory.com

Date Published: 7/15/2022

View: 5388

Fourier Transform(푸리에 변환)의 이해와 활용 – 다크 프로그래머

영상을 주파수 성분으로 변환하여 다양한 분석 및 처리를 할 수 있고 임의의 필터링 … 이미지(영상신호)에서의 푸리에 변환(Fourier transform).

+ 여기에 표시

Source: darkpgmr.tistory.com

Date Published: 11/12/2022

View: 6625

[Image Processing] Fourier Transform (푸리에 변환) – 꾸준희

이는 영상을 x축 또는 y축 방향으로 따라가면서 픽셀의 밝기 변화를 파형 또는 신호로 보고 주파수 분석을 적용하는 것이다. 푸리에 변환을 통해 얻은 각 …

+ 자세한 내용은 여기를 클릭하십시오

Source: eehoeskrap.tistory.com

Date Published: 9/12/2021

View: 4175

[비전5] Frequency and Image – 메모장

Non-Linear Filters. 이미지의 주파수에 대해서 알아보자. 픽셀 데이터로 되어있는 이미지를 픽셀의 변화 값에 따른 frequency 변화 값을 따로 뺄 수 …

+ 여기에 표시

Source: terajh.tistory.com

Date Published: 8/28/2021

View: 4173

푸리에 변환 — gramman 0.1 documentation

푸리에 변환은 주파수를 분석하는데 사용되는 방법입니다. … 이미지 -> 푸리에 변환 -> 고주파 또는 저주파 제거 -> 다시 이미지 변환 과정을 거쳐 경계 또는 배경만 …

+ 여기에 자세히 보기

Source: opencv-python.readthedocs.io

Date Published: 3/6/2021

View: 4435

[OpenCV] 04-11. Image Transforms in OpenCV

Fourier Transform은 다양한 필터의 주파수(frequency) 특성을 분석하는 데 사용된다. 이미지의 경우, 주파수 영역을 찾기 위해 2D Discrete Fourier …

+ 여기에 더 보기

Source: leechamin.tistory.com

Date Published: 11/16/2021

View: 9702

푸리에 변환(Fourier transform) (2) – 영상에서의 응용

공대생의 입장에서 푸리에 변환은 주어진 신호를 주파수 영역에서 손쉽게 해석 … 고역통과 및 저역통과 필터보다 훨씬 자연스러운 이미지가 나온다.

+ 여기에 보기

Source: funmi.tistory.com

Date Published: 5/16/2022

View: 5382

주파수 분석을 통한 가짜 이미지의 식별 – 학사모

인공지능 합성 이미지(deep-fake image)는 믿을 수 없을 정도로 진짜같아 보이지만 실은 컴퓨터에 의해 만들어졌다. 이 이미지들은 머신러닝 알고리즘 …

+ 여기에 자세히 보기

Source: haksamo.com

Date Published: 1/15/2021

View: 1544

13장. 영상 변환

연속적인 시간 영역의 신호를 주파수 영역으로 변환하는 것. 2차원 연속 푸리에 변환 공식. ∫. ∞. ∞. -. -.

+ 여기를 클릭

Source: dongseo.ac.kr

Date Published: 5/23/2021

View: 4379

주제와 관련된 이미지 이미지 주파수 분석

주제와 관련된 더 많은 사진을 참조하십시오 5분만에 이해해보는 푸리에 변환. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

5분만에 이해해보는 푸리에 변환
5분만에 이해해보는 푸리에 변환

주제에 대한 기사 평가 이미지 주파수 분석

  • Author: 공돌이의 수학정리노트
  • Views: 조회수 24,167회
  • Likes: 250822 Like
  • Date Published: 2021. 12. 11.
  • Video Url link: https://www.youtube.com/watch?v=YsG8fJsH9JE

이미지와 주파수 관계

이미지와 주파수 관계

영상처리나 이미지에 대한 컴퓨터 정보를 다룰때 주파수에 관려된 이야기가 나옵니다.

이미지와 주파수? 관련성이 없어 보입니다.

하지만 사람들이 상당한 관련성이 있고 유용하게 때문에 나온 개념 이겠죠 ?

이미지로 부터 주파수를 구하는 방법을 알아 보겠습니다.

이미지에서 주파수란 이미지의 변화하는 정도 입니다.

위의 이미지는 한가지 색만 보입니다. 그래서 주파수 값을 = 0 이라고 합니다.

위의 이미지는 색이 1번 변하게 됩니다. 그래서 주파수 값을 =1 이라고 합니다.

위의 이미지는 색이 20번 변합니다. 그래서 주파수 값을 = 20 이라고 합니다.

간단한 위와 같은 주기가 있는 이미지를 실제 영상과 계산하여 어떠한 결과를 얻는데 그것을 이미지에서 주파수 이미지 라고 합니다.

이유는 주파수 이미지를 계산에 사용하기 때문이죠.

주파수 이미지를 만들어 내기 위해서는 베이스 이미지( 주파수 성분을 가진)가 필요합니다.

베이스 이미지는

이러한 이미지 입니다.

그리고 이러한 베이스 이미지는 규칙이 있습니다.

1 . 변화가 있는 베이스 이미지에서는 흰색 부분,검은색 부분 이 항상 짝을 이루어야합니다.

그래서 실제로 계산에 사용 되는 베이스 이미지는 주파수가 1,2 이런 수치로 말할수 없는 이미지가 사용됩니다.

예를 들면

이러한 베이스 이미지가 계산에 사용 되게 됩니다.

2. 베이스 이미지와 입력 이미지의 픽셀수는 같아야 한다.

주파수 이미지를 구하는 입력 이미지와 베이스 이미지는 항상 같은 픽셀 수를 가져야합니다.

입력 이미지의 픽셀이 2X2 라면 베이스 이미지의 크기도 똑같이 2X2로 만들어야 합니다.

3. 입력 영상 픽셀 수만큼 베이스 이미지를 만든다.

입력 이미지의 픽셀 수가 2X2 일때 총 4개 이므로 베이스 이미지도 서로 다른 4개의 이미지가 필요합니다.

주파수 이미지 구하는 계산

입력 영상을 2X2 라고 하고 베이스 이미지 총 4개를 만듭니다.

하얀 부분의 값을 1 로 하고 검은 부분은 -1 이라는 값이 대응 됩니다.

이때 만들때 변화율의 정도를

위와 같은 대각선 방향으로 점차 늘려 값니다.

주파수 이미지 출력 계산법

여기서 입력 영상의 색을 1와 -1로 계산 했지만 실제 영상은 0~255 까지의 숫자로 표현 됩니다.

그경우 베이스 이미지에서는 흰색 부분은 1 검은색은 -1로 인식 하고

이미지의 경우는 입력 그대로 사용해 주면 됩니다.

결국 베이스 이미지와 얼마나 많은 부분이 비슷한가? 에 대한 수치 입니다.

입력 영상 8X8 의 베이스 이미지 경우 많이 쓰는것은

주파수 이미지의 경우

그리고 위에 봤듯이 출력이 -값도 나오고 255 값보다 높은 값이 나올수 있습니다.

그래서 0~255 까지 양자화를 합니다.

그리고 이미지를 보통 8X8 계산을 위해서

예를 들어 512X512 이미지를 모두 8X8로 자른다음 계산을 합니다.

왼쪽 상단 모서리를 보면 햐얀색으로 보입니다.

그 이유는 베이스 이미지를 보면

좌측 상단은 으로 갈수록 변화율이 적은 곳에서는 상대적으로 이미지에 대해서 + 요소가 많아서 입니다.

그리고 사람은 이미지를 인식 할때 변화율이 적은곳에 훨씬 민감하게 반응 합니다.

그래서 주파수 이미지로 변환된 이미지에서

햐안색 부분은 제외하고 변화율이 많은 베이스 이미지를 써서 결과 값을 얻은 검색은 부분은 데이터를 0 으로 삭제하고

주파수 이미지-> 원본 이미지 변환을 해도 사람이 느끼는 차이는 미비하다는 이론입니다.

실제로도 많이 차이를 느끼지 못합니다.

이렇게 햐얀 부분의 데이터만 남기는 형식으로 압축을 하면 실제 이미지는 일반적으로 75 % 손실 압축을 할수 있습니다.

이러한 압축을 효과적으로 하기 위해서 나온것이 JPEG 이고 이때 사용하는것이 주파수 이미지 계산입니다.

그래서 영상에서 주파수 라는 말이 많이 나오게 됩니다.

다크 프로그래머 :: Fourier Transform(푸리에 변환)의 이해와 활용

푸리에 변환(Fourier transform)에 대해서는 예전부터 한번 정리를 해야겠다고 생각만 했었는데 이번에 기회가 되어 글을 올립니다.

푸리에 변환(Fourier transform)은 신호처리, 음성, 통신 분야에서 뿐만 아니라 영상처리에서도 매우 중요한 개념으로 다양한 응용을 가지고 있습니다. 영상을 주파수 성분으로 변환하여 다양한 분석 및 처리를 할 수 있고 임의의 필터링 연산을 fft(fast Fourier transform)를 이용하여 고속으로 구현할 수도 있습니다. 그리고 푸리에 변환과 같은 근원적인 이론들은 특정 응용에 국한되지 않기 때문에 한번 알아두면 분야를 떠나서 두고두고 도움이 됩니다.

이 글에서는 푸리에 변환(Fourier transform)이 무엇이고 어디에 쓸 수 있는지, 그리고 어떻게 쓸 수 있는지 직관적 이해와 유용한 성질들, 영상처리 응용, 그리고 푸리에 변환(Fourier transform)을 실제 활용하는데 있어서 필요한 사항들을 최대한 직관적으로 정리하고자 합니다.

그동안 푸리에 변환(Fourier transform)에 대해 개인적으로 가지고 있었던 의문은 푸리에 변환을 통해 얻어지는 스펙트럼과 페이즈(phase) 중 페이즈(phase)가 무엇인가? 그리고 푸리에 주파수 공간의 좌표값을 어떻게 해석할까입니다. 아마도 비슷한 의문을 가진 분들도 꽤 있을 것으로 생각됩니다. 이 글을 통해서 그러한 의문에 대한 답도 같이 다루게 됩니다.

1. 푸리에 변환(Fourier transform) – 직관적 이해

모든 공부의 시작은 핵심 개념을 정확히 이해하는데 있다. 그리고 그 이해는 가급적 직관적일수록 좋다.

푸리에 변환(Fourier transform)을 직관적으로 설명하면 푸리에 변환은 임의의 입력 신호를 다양한 주파수를 갖는 주기함수들의 합으로 분해하여 표현하는 것이다.

좀더 들어가면, 푸리에 변환에서 사용하는 주기함수는 sin, cos 삼각함수이며 푸리에 변환은 고주파부터 저주파까지 다양한 주파수 대역의 sin, cos 함수들로 원본 신호를 분해하는 것이다.

아래 그림(그림 1)의 예를 보자. 맨 앞의 붉은 색 신호는 입력 신호이고 뒤의 파란색 신호들은 푸리에 변환(Fourier transform)을 통해 얻어진 (원본 신호를 구성하는) 주기함수 성분들이다. 각각의 주기함수 성분들은 고유의 주파수(frequency)와 강도(amplitude)를 가지고 있으며 이들을 모두 합치면 원본 붉은색 신호가 된다.

그림 1. 푸리에 변환 (그림출처: 위키피디아)

여기서 입력 신호는 전파, 음성 신호 등과 같이 시간축(time)에 대해 정의된 신호일 수도 있고 이미지(image) 등과 같이 공간축에 대해 정의된 신호일 수도 있다. 통신 분야에서는 푸리에 변환(Fourier transform)을 time domain에서 frequency domain으로의 변환이라고 하고, 컴퓨터 비전(computer vision), 영상처리 쪽에서는 spatial domain에서 frequency domain으로의 변환이라고 부른다. 명칭이야 어쨌든 그 핵심은 입력 신호를 sin, cos의 주기성분으로 분해하는 것이다.

푸리에 변환(Fourier transform)의 대단한 점은 입력 신호가 어떤 신호이든지 관계없이 임의의 입력 신호를 sin, cos 주기함수들의 합으로 항상 분해할 수 있다는 것이다. 그리고 그 과정을 수식으로 표현한 것이 푸리에 변환식이다.

2. 푸리에 변환(Fourier transform) – 수식적 이해

어떤 개념을 직관적으로 이해했다면 그 개념에 대한 수식적 이해는 그 개념을 한층 풍성하고 깊이있게 이해하게 해 준다.

푸리에 변환(Fourier transform)은 프랑스의 수학자 Joseph Fourier (1768 ~ 1830)가 제안한 방법으로서 수학사(해석학)의 역사가 새로 씌여질 정도로 대단한 발견이었다고 한다. 그 유명한 푸리에 변환의 수식은 다음과 같다.

, — (1)

. — (2)

여기서 j는 허수단위 , f(x)는 원본 입력 신호, ej2πux는 주파수 u인 주기함수 성분, F(u)는 해당 주기함수 성분의 계수(coefficient)를 나타낸다.

일단 식을 있는 그대로 해석하면 식 (1)은 입력신호 f(x)가 ej2πux들의 합으로 표현(분해)된다는 의미이다 (적분은 합한다는 의미를 갖는다). 그리고 식 (2)는 f(x)를 주기함수 성분으로 분해했을 때의 계수(coefficient) F(u)가 식 (2)로 주어진다는 의미이다. 앞서 그림 1과 연관해 보면 ej2πux는 f(x)를 구성하는 (파란색의 주파수 u인) 주기함수 성분들이고 F(u)는 해당 주기함수 성분의 강도(amplitude)를 나타낸다.

☞ 푸리에 변환에 대한 일반적인 설명 방식은 두번째 식 (2)를 푸리에 변환이라고 정의하고 첫번째 식 (1)을 푸리에 역변환(inverse Fourier transform)이라고 정의하는 것이다. 그리고 푸리에 역변환을 하면 다시 원래의 함수로 돌아온다고 한다. 하지만 이러한 기계적인 이해(푸리에 변환을 어디 하늘에서 뚝 떨어진 정의로만 받아들이는 것)는 푸리에 변환의 본질을 이해하는데 별 도움이 되지 않는다.

이제 식으로 좀더 들어가 보자. 일단, 식 자체는 푸리에 변환의 대단함에 비추어 매우 단순하다 (Simple is the best!!). 다만 한 가지 ej2πux의 의미만 이해하면 된다. 그리고 이를 위해서는 오일러 공식(Euler’s formula)이 필요하다.

오일러 공식(Euler’s formula)은 복소지수함수를 삼각함수로 변환할 수 있도록 하는 유명한 식이다.

— (3)

식 (3)은 증명 가능한 식이며 그 증명은 인터넷에서 어렵지 않게 찾을 수 있다. 어쨌든 오일러 공식을 이용하면 식 (1)의 ej2πux는 실수부가 cos(2πux), 허수부가 sin(2πux)인 주기함수임을 알 수 있다.

— (4)

여기서 cos(2πux), sin(2πux) 모두 주기(period)가 1/u, 주파수(frequency) u인 주기함수이므로 결국 ej2πux는 주파수 u인 정현파(sinusoidal wave)의 복소지수함수 표현임을 알 수 있다.

주기: 파동이 한번 진동하는데 걸리는 시간, 또는 그 길이. sin(wx)의 주기는 2π/w 임.

주파수: 1초 동안의 진동 횟수. 주파수와 주기는 서로 역수 관계 (주파수 = 1/주기)

☞ 정현파(sinusoidal wave)는 파형이 sin 또는 cos 함수인 파동(wave)을 말한다. 그런데, 여기서 왜 갑자기 복소수가 나오고 또 주기함수를 저렇게 표현하느냐고 따질 수 있다. 하지만 여기서는 그냥 복수지수함수는 정현파(sinusoidal wave)를 표현하는 방법 중 하나라는 정도로만 알아두자. 정현파 및 복수지수함수 표현에 대한 보다 자세한 내용은 AngeloYeo님의 페이저(phasor)에 대한 설명글을 참고하기 바란다.

이제 다시 원래의 식 (1), (2)로 돌아가 보자. 식 (1)은 함수 f(x)를 모든 가능한 주파수(u)의 주기함수들(ej2πux)의 일차결합으로 표현한 것이다. 그리고 그 일차결합 계수 F(u)는 식 (2)로 항상 주어질 수 있다는 것이 요지이다. 이와 같이 푸리에 변환식을 볼 수 있다면 푸리에 변환의 핵심을 이해한 것이다.

☞ 식 (1), (2)의 푸리에 변환(Fourier transform)식은 언뜻 보면 정의(definition)로 보이지만 사실은 증명해야 할 정리(theorem)이다. 즉, 식 (2)의 F(u)를 식 (1)에 대입하면 항상 f(x)가 나옴을 증명해야 한다. 이것이 증명되면 모든 임의의 신호함수는 항상 주기함수들의 일차결합으로 분해될 수 있음이 증명되는 것이다 (증명은 이곳 참조).

마지막으로, (증명은 아니지만) 왜 일차결합의 계수 F(u)가 식 (2)로 주어지는지를 선형대수학과 연관지어 직관적으로 이해해 보자. 식 (1)에서 ej2πux, u = 0, ±1, ±2, …은 모든 신호를 생성할 수 있는 직교(orthogonal) 기저(basis) 함수들로 볼 수 있다 (편의상 u를 정수 범위로 표기했으나 u는 실수 전체 범위임). 그러면 입력 신호 f(x)를 이들 기저함수들로 분해했을 때의 계수 F(u)는 f(x)와 기저함수의 내적(dot product)으로 계산될 수 있다 (아래의 ☞선형대수학 관련 설명 참조). 식 (2)는 f(x)와 ej2πux의 함수 내적이기 때문에 그 결과는 f(x)를 ej2πux들로 분해했을 때의 계수가 된다. 따라서, F(u)가 식 (2)로 주어지는 이유가 설명이 되었다. 참고로, 식 (2)에서 j 앞에 -가 붙은 이유는 복소수에서의 내적은 어느 한쪽에 켤레(conjugate) 복소수를 취한 후 계산되기 때문이다.

☞ 선형대수학(linear algebra)에서는 어떤 벡터 공간을 생성할 수 있는 일차독립인 벡터들의 집합을 기저(basis)라고 한다. 만일 기저(basis) 벡터들이 v1, v2, …, vn라 하면 이 벡터공간에 속하는 임의의 벡터 v는 v = a1v1 + a2v2 + … + anvn (ai는 상수)와 같이 기저 벡터들의 일차결합으로 표현될 수 있다 (왜냐하면 vi들이 이 벡터공간의 모든 벡터들을 생성할 수 있으니까). 그런데 만일 기저벡터들이 서로 수직(vi·vj = 0)인 단위벡터라면 일차결합 계수 ai는 내적을 이용하여 ai = v·vi로 손쉽게 계산할 수 있다 (∵ v·vi = (a1v1 + … + anvn)·vi = ai*(vi·vi) = ai). 어떤 벡터와 기저(basis) 벡터를 내적하면 이 벡터에 포함된 기저 성분의 계수가 얻어진다는 것은 선형대수학에서 매우 유용한 성질이다.

☞ F(u)가 식 (2)로 주어지는 이유에 대한 선형대수학적 설명은 개인적 이해 방식이라서 증명이 있거나 근거 문헌이 있는 내용은 아닙니다. 그냥 그런 식으로 이해할 수도 있구나 하고 참고만 하기 바랍니다. 정말 그런지 수학적으로 증명해 봐라 하면 골치아픕니다..

3. 이미지(영상신호)에서의 푸리에 변환(Fourier transform)

푸리에 변환(Fourier transform)을 영상처리에 적용하기 위해서는 이미지(영상신호)가 가지고 있는 몇 가지 차이점을 인지해야 한다. 먼저, 이미지는 2차원의(x축 방향의 변화와 y축 방향의 변화가 동시에 포함된) 신호이기 때문에 2차원에서 정의되는 푸리에 변환이 필요하다. 2차원 신호에 대한 푸리에 변환(Fourier transform)은 다음과 같이 정의된다.

, — (5)

. — (6)

단, 여기서 F(u, v)는 x축 방향으로 주파수(frequency) u, y축 방향으로 v인 주기함수 성분의 계수이다. 그리고 그 값은 식 (6)에 의해 계산된다.

그런데 이미지는 연속(continuous)이 아닌 이산(discrete) 신호이다. 그리고 한정된 유한(finite) 구간에서 정의되는 신호이다. 따라서, 이산 데이터에서 정의되는 푸리에 변환이 필요하다. W x H 크기의 이미지 f(x, y)에 대한 이산 푸리에 변환(discrete Fourier transform)은 다음과 같이 정의된다.

, —(7)

. —(8)

단, x = 0, 1, …, W-1, y = 0, 1, …, H-1이고 u = 0, 1, …, W-1, v = 0, 1, …, H-1.

식 (7)에서 ej2π(ux/W+vy/H)는 x축 방향으로 주파수가 u/W, y축 방향으로 주파수가 v/H인 sinusoidal 주기함수이다 (by 오일러 공식). 일반적인 푸리에 변환식과는 달리 W와 H로의 나누기가 들어있음에 유의해야 하며 이는 데이터가 정의된 구간을 하나의 단위 주기(unit period)로 만드는 효과가 있다. 일종의 정규화 팩터(normalization factor)라고 생각하면 된다.

여기서 2D 이미지를 어떻게 신호로 해석할 수 있는지, 그리고 2D 정현파(sinusoidal wave) ej2π(ux/W+vy/H)가 도대체 어떤 모습일지 아마도 의아해할 수 있다. 첫째, 이미지를 신호로 해석하는 문제는 x 또는 y축을 시간축으로 놓고 좌표의 변화에 따라 변하는 이미지 픽셀의 밝기 변화를 신호로 생각하면 쉽게 이해할 수 있다. 다음으로, 2D에서 정의되는 정현파(sinusoidal wave)의 모습은 아래 그림과 같이 모든 방향으로의 단면이 sinusoidal이 되는 물결 형태의 파동을 생각하면 된다.

그림 2. 2D에서의 sinusoidal wave

앞서 그림 1의 1D 푸리에 변환의 경우와 유사하게 생각해 보면, 이미지에 대한 푸리에 변환(Fourier transform)은 그림 2와 같은 형태의 다양한 2D 정현파들의 합으로 이미지를 분해하여 표현하는 것으로 이해할 수 있다.

이미지에 대한 푸리에 변환(Fourier transform)에서 한 가지 주의해야 할 것은 푸리에 변환의 계수 F(u, v)가 ej2π(ux+vy)의 계수가 아니라 ej2π(ux/W+vy/H)의 계수라는 점이다. 즉, 이산 푸리에 변환에서 F(u, v)는 주파수 u, v 성분이 아니라 주파수 u/W, v/H 성분에 대한 계수를 나타낸다.

W × H 이미지에 대한 이산 푸리에 변환에서 F(u, v)는 – x축 주파수 u/W, y축 주파수 v/H인 주기함수 성분에 대응 – 주기로는 x축 방향 W/u 픽셀, y축 방향 H/v 픽셀인 주기성분을 나타냄 (주기 = 1/주파수)

☞ 바로 이 부분이 개인적으로 푸리에 변환에 대해서 혼동스러웠던 부분 중 하나이다. W x H 이미지의 푸리에 변환에서 F(u, v)는 주파수 u, v의 성분이 아니라 주파수 u/W, v/H 성분이다. 따라서, 주파수 공간에서 특정 F(u, v) 값이 높게 나타났다면 원래의 이미지 공간에서는 x축 방향으로 주기가 W/u 픽셀, y축 방향 주기가 H/v 픽셀인 주기성 성분이 존재한다는 의미가 된다.

참고로, 1차원에서의 함수 f(x), x = 0, 1, 2, …, W-1에 대한 이산 푸리에 변환(discrete Fourier transform)은 다음과 같이 정의된다.

— (9)

— (10)

☞ 1차원 이산 푸리에 변환(discrete Fourier transform)식은 실제 푸리에 변환을 컴퓨터로 구현하는데 있어서 가장 기본이 되는 식이다. 왜냐하면 파동과 같은 연속 신호라 할지라도 실제 분석에 있어서는 샘플링된 이산 데이터를 이용해야 하고 2차원 푸리에 변환에 대한 구현도 내부적으로는 1차원 푸리에 변환을 이용하여 구현되기 때문이다.

4. 푸리에 스펙트럼(spectrum)과 페이즈(phase)

이제 실제로 푸리에 변환(Fourier transform)을 통해 얻어지는 F(u, v) 값들이 어떤 의미를 가지며 어떤 형태(visualization)를 갖는지 살펴보자.

푸리에 변환을 통해 얻어지는 F(u, v)는 복소수(complex number)이며 실수부(Real)와 허수부(Imaginary)로 구성된다 (1차원 푸리에 변환의 경우도 마찬가지이다).

— (11)

이 때, 복소수 F(u, v)의 크기 |F(u, v)|를 푸리에 변환의 spectrum(스펙트럼) 또는 magnitude라고 부르고, F(u, v)의 각도 Φ를 phase(페이즈) angle 또는 phase spectrum이라고 부른다.

— (12)

— (13)

A. 푸리에 스펙트럼(Fourier spectrum)

먼저, 푸리에 스펙트럼(Fourier spectrum)에 대해 살펴보자. 푸리에 스펙트럼은 해당 주파수 성분이 원 신호(이미지)에 얼마나 강하게 포함되어 있는지를 나타낸다. W x H 이미지를 푸리에 변환(Fourier transform)하면 식 (7), (8)에 의해 W x H의 F(u, v), u = 0, …, W-1, v = 0, …, H-1 가 얻어진다. 따라서, |F(u, v)|를 픽셀값으로 잡으면 아래 예와 같이 푸리에 스펙트럼을 원본 이미지와 동일한 크기의 이미지로 시각화할 수 있다.

그림 3. 푸리에 스펙트럼(spectrum)과 좌표계

(a) 입력 이미지, (b) 푸리에 스펙트럼, (c) shifted 스펙트럼

푸리에 스펙트럼(Fourier spectrum)을 이미지로 시각화하는 데에는 2가지 문제점이 있다. 먼저, 푸리에 스펙트럼은 저주파 영역은 매우 큰 값을 갖는 반면에 대부분의 다른 영역은 0에 가까운 값을 갖는다. 따라서 푸리에 스펙트럼을 그대로 이미지로 시각화하면 검은 바탕 위에 흰점 하나만 존재하는 형태가 된다. 이러한 문제를 해결하기 위해서 스펙트럼을 이미지로 표현할 때에는 그림 3(b)처럼 스펙트럼에 log를 취하는 것이 일반적이다. 다음으로, 원래의 스펙트럼 이미지는 그림 3(b)처럼 모서리로 갈수록 값이 높아지기 때문에 스펙트럼의 형태를 파악하기 힘들다. 따라서 이러한 문제를 해결하기 위해 그림 3(c)처럼 원점이 중심(center)에 오도록 스펙트럼의 위치를 이동시킨(shift) 형태의 이미지를 사용하는 것이 일반적이다 (아래 ☞설명 참조). 앞으로 푸리에 스펙트럼 이미지라 하면 그림 3(c)와 같은 shifted 스펙트럼 이미지를 생각하면 된다.

☞ 그림 3(c)와 같은 shift가 가능한 이유는 푸리에 스펙트럼이 원점대칭인 주기함수이기 때문이다. 사실 식 (9), (10)로 주어지는 이산 푸리에 변환(discrete Fourier transform)식은 f(x)가 주기함수일 때에만 성립하는 식이다. 원래의 입력신호 f(x)는 x = 0, 1, …, W-1의 유한 구간에서 정의된 함수이다. 우리가 관심있는 부분은 0 ~ W-1 구간에서의 특성이므로 그 외의 구간에 대해서는 함수를 어떻게 정의해도 무방하다. 따라서, 푸리에 변환 적용을 위해 이 함수를 확장하여 f(x + W) = f(x)인 주기함수(0 ~ W-1에서의 함수값이 다른 구간에서도 계속 반복)로 가정하고 식을 세운 것이 식 (9), (10)이다. 이 때, F(u) 또한 f(x)와 동일한 주기(W)의 주기함수가 된다. 즉. F(u) = F(u + W). 또한 식 (10)에서 |F(u)| = |F(-u)|임도 쉽게 알 수 있다. 즉, 이산 푸리에 스펙트럼은 원점대칭이면서 W를 주기로 하는 주기함수 형태임을 알 수 있다. 2차원의 경우도 마찬가지이며 F(u, v) = F(u + W, v) = F(u, v+ H) = F(u + W, v + h), |F(u, v)| = |F(-u, -v)|인 주기함수가 된다. 그리고 이러한 원점 대칭성과 주기성으로 인해 스펙트럼 이미지를 그림 3(c)와 같이 shift하여 표현하는 것이 가능해진다.

shifted 스펙트럼을 이해하기 위해 한 예로 아래 그림 4의 왼쪽과 같은 형태의 스펙트럼 신호를 생각해 보자. 그런데 만일 스펙트럼이 원점대칭이고 W를 주기로 반복된다면 푸리에 스펙트럼은 오른쪽과 같은 형태가 될 수밖에 없음을 알 수 있다. 원래의 푸리에 스펙트럼의 형태는 구간 0 ~ W의 형태(그림 3b)이지만 (어차피 정보가 반복되기 때문에) 이를 구간 -W/2 ~ W/2 형태(그림 3c)로 shift하여 표현한 것이 shifted 스펙트럼이다.

그림 4. 푸리에 스펙트럼의 주기 특징

B. 푸리에 스펙트럼의 해석

앞서 푸리에 스펙트럼(Fourier spectrum)은 해당되는 주파수 성분의 강도를 나타난다고 했는데, 정말 그런지 그리고 이 값이 이미지 도메인에서 어떻게 해석될 수 있는지 실제 예를 통해서 살펴보자.

아래 예는 이미지에 인위적으로 주기성분을 추가하였을 때 주파수 공간에서의 푸리에 스펙트럼이 어떻게 변하는지를 보여준다. 원본 이미지의 해상도는 205 × 205 픽셀이며(W = 205, H = 205) 따라서 스펙트럼 이미지도 205 x 205 해상도를 갖는다.

그림 5. 주기성분 추가에 따른 푸리에 스펙트럼의 변화

먼저, 그림 5(a)는 원본 이미지 및 대응되는 푸리에 스펙트럼 이미지를 보여준다. 그림의 예와 같이 일반적인 푸리에 스펙트럼 이미지는 원점 F(0, 0) 주변의 저주파 영역에서 강한 피크(peak)가 나타나고 원점에서 멀어질수록 즉, 고주파 영역으로 갈수록 값이 급격히 작아지는 형태를 갖는다.

그림 5(b)는 (a)의 이미지에 5 픽셀(pixel) 간격의 수평선을 인위적으로 추가한 경우이다. 그러면 주파수 공간에서는 그림과 같이 F(0, 41), F(0,82)에 강한 피크(peak)가 나타난다. 앞서 이산 푸리에 변환에서 F(u, v)는 x축 주기 W/u 픽셀, y축 주기 H/v 픽셀인 주기성분의 계수라 했다. 그러면, F(0, 41)은 주기가 x축 방향 205/0 = ∞, y축 방향 205/41 = 5 픽셀인 주기성분에 대응된다. 그리고 이것은 그림 5(b)를 만들 때 사용한 수평선의 주기(세로방향 5픽셀)와 정확히 일치한다.

☞ F(0, 82)에도 피크(peak)가 나타나는 것은 y축 방향으로 205/82 = 2.5 픽셀 간격의 주기 성분이 입력 이미지에 있다는 의미이다. 이는 이미지에 추가한 수평선이 정현파(sinusoidal wave)가 아니라 계단 형태이기 때문에 5 픽셀 주기의 정현파와 2.5 픽셀 주기의 정현파를 합쳐서 그러한 계단 형태를 근사했기 때문이다.

다음으로, 이번에는 그림 5(c)와 같이 대각선 방향의 정현파를 (a)의 이미지에 추가해 보자. 추가한 정현파는 x축 방향 주기 20 pixel, y축 방향 주기 10 픽셀인 2D sin 함수를 이용했다. 이 때, 푸리에 스펙트럼에는 F(10, 20.5)에 강한 피크(peak)가 생성됨을 확인할 수 있다. 즉, x축 방향으로는 W/u = 205/10 = 20.5 픽셀, y축 방향으로는 H/v = 205/20.5 = 10 픽셀의 주기 성분이 입력 이미지에 있음을 의미한다. 그리고 이는 실제 입력 이미지에 추가된 주기 성분과 정확히 일치한다 (소수점 오차는 u, v좌표를 정수로 표현함에 의한 것이다).

이상으로 주파수 공간에서의 F(u, v)가 입력 이미지 공간에서 어떻게 연관되어 해석될 수 있는지를 실제 예를 통해서 살펴보았다. 마지막으로 앞서 그림 5(b), (c)에서 스펙트럼의 피크(peak) 영역을 지운 후 푸리에 역변환(inverse Fourier transform)하면 아래와 같은 재미있는 결과를 얻을 수 있다 (지운다는 의미는 해당되는 F(u, v) 값들을 0으로 만든다는 의미이다).

그림 6. 푸리에 변환을 이용한 주기 성분 제거

☞ [개발한 것들] – FFT와 모아레 제거 프로그램을 이용하면 이미지의 푸리에 변환, 특정 스펙트럼 삭제 및 역변환을 직접 테스트해 볼 수 있다.

C. 푸리에 변환의 페이즈(phase)

푸리에 변환(Fourier transform)에서 스펙트럼(spectrum)은 잘 알려진 반면 페이즈(phase)는 상대적으로 잘 알려져 있지 않다. 하지만 페이즈(phase)에도 스펙트럼(spectrum) 못지 않은 중요한 정보가 담겨 있다고 한다.

페이즈(phase)를 우리말로 번역하면 ‘단계’가 되고 전문용어로는 ‘위상’이 된다. 위키피디아에는페이즈(phase, 위상)를 ‘반복되는 파형의 한 주기에서 첫 시작점의 각도 혹은 어느 한 순간의 위치’라고 정의한다. 즉, 파형(wave)의 시점이 어디인지가 페이즈(phase)이다. 예를 들어, sin 파와 cos 파는 90도의 페이즈(phase, 위상) 차이가 존재하는 동일한 파형으로 볼 수 있다.

푸리에 변환의 관점에서 보면 페이즈(phase)는 원본 신호를 주기 신호로 분해했을 때 각 주기성분의 시점이 어딘인지(즉, 각 주기성분들이 어떻게 줄을 맞춰서 원본 신호를 생성했는지)를 나타내는 요소가 된다.

아래 그림은 페이즈(phase)의 영향을 보여주는 예로서 파란색 주기성분 신호들을 합쳐서 빨간색 신호가 생성되는 예를 보여준다. 왼쪽, 오른쪽 경우 모두 동일한 주파수의 주기성분들을 합쳤지만 각 성분의 페이즈(phase) 차이로 인하여 전혀 다른 신호가 생성됨을 확인할 수 있다.

그림 7. 페이즈(phase) 차이에 따른 신호 생성의 차이

다음으로 푸리에 변환의 페이즈(phase)가 어떻게 수식으로 표현되는지 살펴보자. (1차원) 푸리에 변환의 계수 F(u)는 식 (12), (13) 및 오일러 공식에 의해 다음과 같이 극좌표(polar coordinate) 형태로 표현될 수 있다 (설명의 편의상 1차원의 경우를 예로 든다).

— (14)

☞ 실수축이 x축, 허수축이 y축인 복소평면에서 F(u)는 x축과 이루는 각이 Φ인 막대기의 끝점 (R, I)에 대응된다. 이 때, R = |F|cosΦ, I = |F|sinΦ이므로 F = |F|cosΦ + j|F|sinΦ = |F|ejΦ.

이제 식 (14)를 식 (1)에 대입하면,

. — (15)

와 같이 페이즈(phase) 텀이 주기함수 성분의 시점을 조절하는 텀이 된다.

즉, 푸리에 계수 F(u)에는 대응되는 주기함수 성분의 강도(amplitude)를 나타내는 스펙트럼 정보 |F(u)|와 시점을 조절하는 페이즈(phase) 정보 Φ(u)가 함께 포함되어 있음을 알 수 있다.

참고로, 푸리에 스펙트럼(spectrum)과 페이즈(phase)에 관한 재미있는 비교 결과를 하나 소개한다. 아래 그림 8에서 (a)는 원본 이미지, (b)는 푸리에 스펙트럼을 보존하고 페이즈(phase)를 랜덤(random)하게 했을 때의 역변환 결과, (c)는 페이즈(phase)를 보존하고 스펙트럼을 랜덤하게 했을 때의 역변환 결과이다. 결과를 보면 이미지의 푸리에 변환에서 스펙트럼(spectrum)보다 페이즈(phase)에 보다 더 중요한 정보가 포함되어 있음을 확인할 수 있다.

그림 8. 푸리에 스펙트럼과 페이즈의 중요도 비교

5. 푸리에 변환의 유용한 성질들

마지막으로 푸리에 변환(Fourier transform)에 대한 몇 가지 유용한 성질들을 정리하면 다음과 같다.

– 주파수 공간의 원점 F(0, 0)의 값은 이미지의 평균값과 일치

– Impulse 함수(Dirac delta 함수)에 대한 푸리에 변환/역변환은 유니폼(uniform) 함수 (아래 식에서 푸리에 변환/역변환 관계를 ⇔ 로 표기).

– 가우시언(Gaussian) 함수의 푸리에 변환/역변환은 가우시언 함수가 됨

6. 맺음말

이상으로 푸리에 변환(Fourier transform)에 대한 정리를 마칩니다. 원래는 이렇게까지 길게 쓸 생각은 아니없는데 쓰다 보니 글이 길어졌네요.. ^^

참고자료 및 유용한 관련 글 링크

푸리에 변환 by jipark

푸리에 급수의 시작 by 전파거북이

푸리에 변환 by 전파거북이

페이저(phasor) by AngeloYeo

허수의 존재 의미에 대하여 by AngeloYeo

Magnitude and Phase by Deepa Kundur (토론토 대학)

What information is contained in the phase spectrum of a signal?

by 다크 프로그래머

[Image Processing] Fourier Transform (푸리에 변환)

728×90

반응형

Fourier Transform (푸리에 변환)

푸리에 변환(Fourier Transform) 이란 어떤 시간 도메인(time domain)에서 표현된 신호를 주파수 도메인(frequency domain)에서의 표현으로 변환해주는 것을 말한다. 영상처리에서는 2차원 푸리에 변환을 사용하게 된다. 이는 영상을 x축 또는 y축 방향으로 따라가면서 픽셀의 밝기 변화를 파형 또는 신호로 보고 주파수 분석을 적용하는 것이다. 푸리에 변환을 통해 얻은 각 주파수 성분의 강도를 스펙트럼(spectrum)이라고 부른다. 이 스펙트럼도 이미지처럼 표현이 가능하다.

또한, 푸리에 변환은 신호를 주파수 영역에서 분석하기 위해 사용된다. 푸리에 변환의 기본 개념은 하나의 신호는 여러 개의 sin 신호와 cos 신호의 합으로 표현할 수 있다는 것이고, 이 sin 신호와 cos 신호의 주파수 성분이 어떻게 구성되어 있는지를 파악하여 신호를 분석하게 된다. 다음 수식은 2차원 푸리에 변환과 sin과 cos을 오일러 공식을 통해 exp로 표현하고 있다. 푸리에 변환을 통해 신호해석을 용이하게 할 수 있다.

(그림 1) A two dimensional images Fourier transform

푸리에 변환은 보통 DFT로 나타내는데 이산 푸리에 변환(Discrete Fourier Transform)으로 나타난다. 이는 이론적인 푸리에 변환을 실제 컴퓨터에서 실행 가능하게 만든 알고리즘이다. 이 DFT를 훨씬 빠르게 처리하기 위한 것이 바로 고속 푸리에 변환(FFT, Fast Fourier Transform)이다.

영상처리에서 푸리에 변환은 영상을 개선하는데 주로 많이 쓰인다. 저번에 만들어 두었던 (salt and pepper) 노이즈 예제 이미지를 가지고 푸리에 변환을 수행해 보았다.

(그림 2) 노이즈가 있는 입력영상의 푸리에 변환 이미지

이와 같이 푸리에 변환은 영상을 개선하기 위해 노이즈 처리하기 힘든 입력영상을 노이즈 처리하기에 좋은 주파수영역으로 바꾼 다음 노이즈를 제거하는 역할을 수행하게 된다. 위 이미지의 오른쪽 이미지는 푸리에 변환을 수행한 spectrum magnitude 이미지이다. 이 주파수 영역을 나타내는 스펙트럼 이미지에서 입력영상의 노이즈 부분에 해당하는, 즉 고주파 영역이나 저주파 영역에 해당하는 부분을 아래와 같이 제거해 준다면 개선된 영상을 얻을 수 있다.

(그림 3) 노이즈 영역을 제거한 스펙트럼 영상

이렇게 스펙트럼 영상에서 노이즈 영역에 해당하는 부분을 제거하고 푸리에 역변환(IDFT)을 수행하여 원래의 입력영상 도메인으로 바꾸면 개선된 이미지를 얻을 수 있게 된다. 푸리에 변환에 의한 필터링 과정은 다음과 같다.

f(x, y) ——- F(x, y) ——- H(u, v)F(u, v) ——- g(x, y)

Forward DFT Filtering InverseDFT

이러한 필터링 과정에서 H(u, v) 부분을 구현할 때 유의해야 할 점은 F(u, v)와 같은 크기의 영상 또는 행렬로 생성하지 않고, F(u, v)의 u, v 에 따라 H(u, v)의 스칼라 값을 계산하여 F(u, v)에 곱하는 방식을 사용하게 된다.

이러한 H(u, v) 부분에 적용하여 구현 할 수 있는 필터는 다음과 같은 필터가 있다.

1. 저주파 통과 필터(lowpass filtering)

저주파 통과 필터는 F(u, v)의 저주파 영역은 통과시키고 고주파 영역은 0으로 만들어 통과시키지 않는 필터를 말한다. 영상에서 잡음을 제거하거나 또는 약화시키고 블러링하여 에지 등의 세밀한 부분을 부드럽게 만드는 역할을 한다.

1.1 이상적인 저주파 통과 필터(ideal lowpass filtering)

이상적인 저주파 통과 필터는 주파수 영역의 원점으로부터 거리 D가 절단 주파수 D0 미만이만 통과시키고, 그렇지 않으면 통과시키지 않도록 하는 필터이다.

1.2 버터워스(Butterworth) 저주파 통과 필터

버터워스 필터는 절단 주파수 D0과 정수 n을 사용하여 필터H(u, v)가 완만하게 0에서 1사이의 실수 값을 갖도록 한다. 영상의 중심에서는 H(u, v) = 1 을 갖고, 멀어질수록 0에 가까운 값을 갖는다.

1.3 가우시안 저주파 통과 필터

가우시안 저주파 통과 필터는 D0을 표준편차로 갖는 가우시안 함수에 의해 H(u, v)가 완만하게 0에서 1사이의 실수 값을 갖는다. 중심에서는 H(u, v) = 1을 갖고, 중심에서 멀어질수록 0에 가까운 값을 갖게 된다.

2. 고주파 통과 필터(high pass filtering)

고주파 통과 필터는 F(u, v)의 고주파 영역은 통과시키고 저주파 영역은 0으로 만들어 통과시키지 않는 필터를 말한다. 고주파 통과 필터는 영상을 날카롭게 강조하는 샤프팅 효과를 일으킨다. 입력영상에서 고주파 통과 필터링을 하여 IDFT 하면 변화가 없는 영역은 0 의 값을, 변화가 심한 에지 영역은 양수 또는 음수의 값을 갖게 된다.

2.1 이상적인 고주파 통과 필터

2.2 버터워스 고주파 통과 필터링

2.3 가우시안 고주파 통과 필터링

이와 관련된 프로그램은 개발중이며 향후 내용에 추가할 계획이다.

참고자료 1

: http://docs.opencv.org/2.4/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html

참고자료 2 : http://darkpgmr.tistory.com/14

참고자료 3 : http://paulbourke.net/miscellaneous/imagefilter/

참고자료 4 :

http://blog.naver.com/PostView.nhn?blogId=laonple&logNo=220834097950&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

728×90

반응형

[비전5] Frequency and Image

◆1. Non-Linear Filters

이미지의 주파수에 대해서 알아보자.

픽셀 데이터로 되어있는 이미지를 픽셀의 변화 값에 따른 frequency 변화 값을 따로 뺄 수 있다. 이를 주파수라고 하면 해당 주파수 만을 뽑아내서 주파수 도메인으로 확인해볼 수 있다. 이 때 사용되는 변환 방법으로 푸리에 변환( Fourier transform )이 있다.

푸리에 변환을 통해 이미지를 변환하게 되면 보통 각 frequency의 Coefficient 값으로 표현한다.

이미지를 위의 그래프와 같이 각 주파수에 따른 Coefficient 만 남겨두는 식으로 압축(?!)해서 저장해둘 수가 있다. 또한 FFT의 교환법칙을 통해 CNN 에서의 for 문 3개를 쓴 세제곱 복잡도를 줄일 수 있다는 장점도 가지고 있다.

일반적으로 영상처리 비전 쪽에서 이 푸리에 변환은 영상을 개선하는데 주로 많이 쓰인다.

노이즈가 있는 입력영상의 푸리에 변환 이미지

이와 같이 푸리에 변환은 영상을 개선하기 위해 노이즈 처리하기 힘든 입력 영상을 노이즈 처리하기에 좋은 주파수영역으로 바꾼 다음 노이즈를 제거하는 역할을 수행하게 된다.

위 이미지의 오른쪽 이미지는 푸리에 변환을 수행한 spectrum magnitude 이미지이다. 이 주파수 영역을 나타내는 스펙트럼 이미지에서 입력 영상의 노이즈 부분에 해당하는, 즉 고주파 영역이나 저주파 영역에 해당하는 부분을 아래와 같이 제거해 준다면 개선된 영상을 얻을 수 있다.

노이즈 영역을 제거한 스펙트럼 영상

이렇게 스펙트럼 영상에서 노이즈 영역에 해당하는 부분을 제거하고 푸리에 역변환(IDFT)을 수행하여 원래의 입력 영상 도메인으로 바꾸면 개선된 이미지를 얻을 수 있게 된다. 푸리에 변환에 의한 필터링 과정은 다음과 같다.

이러한 필터링 과정에서 H(u, v) 부분을 구현할 때 유의해야 할 점은 F(u, v)와 같은 크기의 영상 또는 행렬로 생성하지 않고, F(u, v)의 u, v 에 따라 H(u, v)의 스칼라 값을 계산하여 F(u, v)에 곱하는 방식을 사용하게 된다.

이러한 H(u, v) 부분에 적용하여 구현 할 수 있는 필터는 다음과 같은 필터가 있다.

ⓐ 저주파 통과 필터 (Low-pass filter)

저주파 통과 필터는 F(u, v)의 저주파 영역은 통과시키고 고주파 영역은 0으로 만들어 통과시키지 않는 필터를 말한다. 영상에서 잡음을 제거하거나 또는 약화시키고 블러링하여 에지 등의 세밀한 부분을 부드럽게 만드는 역할을 한다.

ⓑ 고주파 통과 필터 (High-pass filter)

고주파 통과 필터는 F(u, v)의 고주파 영역은 통과시키고 저주파 영역은 0으로 만들어 통과시키지 않는 필터를 말한다. 고주파 통과 필터는 영상을 날카롭게 강조하는 Sharpenning 효과를 일으킨다. 입력 영상에서는 고주파 통과 필터링을 하여 IDFT 하면 변화가 없는 영역은 0의 값을, 변화가 심한 에지 영역은 양수 또는 음수의 값을 갖게 된다.

퓨리에 변환의 목표는 어떻게 영상을 저주파 성분으로 조그맣게 두었따가 고주파 성분으로 신호를 확대시켰을 때 신호가 제대로 남아있을까? 를 해결하는 것이다.

Fourier Bases

위에서 말했듯이 이미지를 Fourier Transform 하여 Coefficient 값만 남겨둔다고 했었다. 그러면 해당 Coefficient 에 해당하는 주파수는 어떻게 저장하나? 에 대한 답이 Fourier Bases 이다.

기본적인 주파수 Bases 를 따로 두어 Coefficient 데이터에 계산해주는 식으로 이미지를 복원시킬 수 있다.

Edit frequencies

보이는 그림처럼 fourier 변환하여 뽑아낸 Fourier d

ecomposition image 를 조작하여 원래 이미지를 다룰 수 있다. 위에서 말한 Low-pass filter 와 High-pass filter 도 이 decomposition image 로 다룰 수 있다.

다만 이 정도는 알아두자. 저 decomposition image 에서 가운데 원 부분이 low frequency를 나타내는 coefficient 이고, 외각으로 갈수록 high frequency 를 나타내는 coefficient 라는 것이다.

예를 들어 low frequency를 버린다는 말은 면을 거른다는 말이고, high frequency를 버린다는 말은 edge 를 버린다는 말이다.

Amplitude & Phase

저 decomposition image 는 푸리에 변환 이후의 amplitude 를 의미한다.

우측의 Phase 는 이미지의 ‘패턴’ 을 의미한다. 보통 모공과 같은 정확한 정보를 위해서는 ‘패턴’을 정보화 한 phase 를 사용하는데 많이 쓰지는 않는다.

정리해서 Amptitude 가 더 사람이 이해하기 직관적인 info 이고, Phase 는 직관적인 정보 보다는 정확한 정보로써 패턴을 정보화한 정보구나~ 라는 것을 알고 있으면 될 듯 싶다.

Edge Artifact Problem

위의 가우시안 필터와 Box filter 두 가지를 통해 이미지 blur 처리를 했을 때, box filter 는 이상한 edge들이 있는 것을 확인할 수 있다. 왜 그럴까?

FT 로 설명할 수 있다. FT 는 위에서 말했듯이 교환 법칙 및 결합 법칙이 가능해서 CNN 의 복잡도를 줄일 때 사용할 수 있다고 했다.

Box filter 를 FT 하게 되면

다음과 같이 갑자기 변하는 경계면 때문에 edge artifact 가 생기게 된다.

따라서 ((IMAGE * FT) * (BoxFilter*FT)) * IFT = BlurIMAGE 에서 edge artifact 가 계속 영향을 끼치게 된다. 때문에 Box filter 로 blur 처리했을 시 edge artifact 에 의해 이상한 edge 들이 있는 것을 확인할 수 있다.

Aliasing problem

이미지 scale 을 줄였을 때 high frequency component 를 잃는 것을 Aliasing problem 이라고 한다.

허나 이렇게 말하면 직관적으로 어떤 problem 인지 확 와 닿지가 않는다. 예를 들어 동영상을 찍을 때, 자동차의 바퀴 회전이 뒤로 가는(?!) 모습으로 찍힌 것을 볼 수 있다. 이를 Aliasing problem 이라고 한다. 즉, 영상의 frame 주파수가 실제 해당 물체의 frequency를 따라가지 못해 생기는 문제이다.

이를 해결하기 위해 어떻게 해야할까?

Nyquist-Shannon Sampling Theorem

2가지의 해결 방법이 있다.

Sampling more!: 영상을 찍는다면 사진기가 찍는 frame 주파수 성능이 실제 물체의 주파수 2배 이상이 되도록 한다.

원본을 blur 하게 만든다.: 사진기를 바꿀 수 없다면 아예 실제 물체의 주파수를 blur 처리하여 줄여버린다.

푸리에 변환 — gramman 0.1 documentation

#-*- coding:utf-8 -*- “”” # Fourier Transform(푸리에 변환) . 시간 도메인(X축)에서 표현된 신호(일반적인 파형 도표)를 주파수 도메인으로 변환. . 시간축이 제거되어 대상의 전체적인 특징을 파악할 수 있음. . 이미지에 적용이 되어 중심이 저주파 영역, 주변이 고주파 영역을 나타냄. . 푸리에 변환을 하여 저주파 또는 고주파를 제거하고 다시 역으로 이미지로 변환 함으로써 이미지가공을 할 수 있음. (ex; 푸리에 변환 후 중심의 저주파를 제거하고 다시 Image로 전환 하면 이미지의 경계선만 남게 됨. 푸리에 변환 후 주변의 고주파를 제거하면 모아레 패턴(휴대폰으로 모니터를 찍었을 때 나타나는 현상) 을 제거할 수 있음.(모니터의 고주파를 제거함.) ) “”” import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2 . imread ( ‘images/lena.jpg’ ) b , g , r = cv2 . split ( img ) img = cv2 . merge ([ r , g , b ]) img = cv2 . cvtColor ( img , cv2 . COLOR_BGR2GRAY ) “”” # Fourier Transform을 적용. 적용을 하면 0,0, 즉 화면 좌측상단점이 중심이고, 거기에 저주파가 모여 있음. 분석을 용이하게 하기 위해 0,0을 이미지의 중심으로 이동 시키고 Log Scaling을 하여 분석이 용이한 결과값으로 변환 “”” f = np . fft . fft2 ( img ) # 이미지에 푸리에 변환 적용 fshift = np . fft . fftshift ( f ) #분석을 용이하게 하기 위해 주파수가 0인 부분을 중앙에 위치시킴. 중앙에 저주파가 모이게 됨. magnitude_spectrum = 20 * np . log ( np . abs ( fshift )) #spectrum 구하는 수학식. rows , cols = img . shape crow , ccol = rows / 2 , cols / 2 # 이미지의 중심 좌표 # 중앙에서 10X10 사이즈의 사각형의 값을 1로 설정함. 중앙의 저주파를 모두 제거 # 저주파를 제거하였기 때문에 배경이 사라지고 경계선만 남게 됨. d = 10 fshift [ crow – d : crow + d , ccol – d : ccol + d ] = 1 #푸리에 변환결과를 다시 이미지로 변환 f_ishift = np . fft . ifftshift ( fshift ) img_back = np . fft . ifft2 ( f_ishift ) img_back = np . abs ( img_back ) #threshold를 적용하기 위해 float type을 int type으로 변환 img_new = np . uint8 ( img_back ); ret , thresh = cv2 . threshold ( img_new , 30 , 255 , cv2 . THRESH_BINARY_INV ) plt . subplot ( 221 ), plt . imshow ( img , cmap = ‘gray’ ) plt . title ( ‘Input Image’ ), plt . xticks ([]), plt . yticks ([]) plt . subplot ( 222 ), plt . imshow ( magnitude_spectrum , cmap = ‘gray’ ) plt . title ( ‘Spectrum’ ), plt . xticks ([]), plt . yticks ([]) plt . subplot ( 223 ), plt . imshow ( img_back , cmap = ‘gray’ ) plt . title ( ‘FT’ ), plt . xticks ([]), plt . yticks ([]) plt . subplot ( 224 ), plt . imshow ( thresh , cmap = ‘gray’ ) plt . title ( ‘Threshold With FT’ ), plt . xticks ([]), plt . yticks ([]) plt . show ()

[OpenCV] 04-11. Image Transforms in OpenCV

728×90

반응형

< Fourier Transform >

이번 장에서는

OpenCV를 사용하여 이미지의 Fourier Transform을 찾을 것이다.

Numpy에서 FFT함수를 이용하기 위해

Fourier Transform의 기능들

다음의 함수를 볼 것 이다 : cv2.dft(), cv2.idft() 등등

Theory

Fourier Transform은 다양한 필터의 주파수(frequency) 특성을 분석하는 데 사용된다. 이미지의 경우, 주파수 영역을 찾기 위해 2D Discrete Fourier Transfrom(DFT)를 사용한다. Fast Fourier Transform(FFT)이라는 고속 알고리즘이 이미지 처리 또는 신호 처리에서 확인해 볼 수 있다.

사인곡선의 신호의 경우, x(t)=Asin(2πft) 에서 f 는 신호의 주파수를 나타낸다. 신호가 샘플링되어서 이산 신호를 형성하면 동일한 주파수 영역을 얻지만, [−π,π] 또는 [0,2π] 의 범위에서 주기적이다. 이미지를 두 방향으로 샘플링되는 신호로 간주할 수 있다. 따라서 Fourier Transform을 X와 Y의 방향으로 하면 이미지의 주파수 표현을 얻을 수 있다.

더 직관적으로, 사인곡석의 신호의 경우, 짧은 시간에 진폭이 그렇게 빠르게 변화하면 고주파 신호라고 할 수 있다. 천천히 변화하면 저주파 신호이다. 같은 아이디어를 이미지로 확장할 수 있다. 이미지에서 진폭이 크게 변하는 곳은 어디일까? 가장자리 부분이나 노이즈가 있는 부분일 것이다. 그래서 다음과 같이, 가장자리와 노이즈는 이미지에서 고주파 부분이라고 할 수 있다. 진폭에 큰 변화가 없으면 저주파 성분인 것이다.

이제 Fourier Transform을 어떻게 찾을지 볼 것이다.

Fourier Transfrom in Numpy

먼저 Numpy를 사용하여 Fourier Transform을 찾는 법을 볼 것이다. Numpy는 이를 하기 위한 FFT 패키지가 있다. np.fft.fft2()는 복잡한 배열로 주파수 변환을 제공한다. 첫 번째 인자는 입력 이미지이고, 흑백스케일이다. 두 번째 인자는 임의로써 결과 배열의 크기를 정한다. 만약에 입력 이미지의 크기보다 크다면 입력 이미지는 FFT 연산이전에 제로-패딩을 거친다. 만약에 입력 이미지보다 작을 경우, 입력 이미지는 잘려진다(cropped). 아무 인자도 안넘겨진다면, 결과 배열의 크기는 입력과 동일할 것이다.

이제 결과를 받았으면, 0 주파수 성분은 왼쪽 위에 위치할 것이다. 만약 이를 가운데로 가지고오고 싶으면, 두 방향으로 N2 만큼 결과를 옮겨야 한다. 이는 np.fft.fftshift()로 쉽게 할 수 있다. 주파수 변환을 찾으면 크기 스펙트럼도 찾을 수 있다.

import numpy as np import cv2 import matplotlib.pyplot as plt img = cv2.imread(‘./images/face2.jpg’,0) f = np.fft.fft2(img) fshift = np.fft.fftshift(f) magnitude_spectrum = 20*np.log(np.abs(fshift)) plt.subplot(121), plt.imshow(img,cmap=’gray’) plt.title(“Input Image”), plt.axis(‘off’) plt.subplot(122), plt.imshow(magnitude_spectrum,cmap=’gray’) plt.title(“Magnitude Spectrum”), plt.axis(‘off’) plt.show()

결과는 아래와 같다.

가운데의 흰색 영역을 볼 수 있는데, 이는 저주파수 함량이 더 많다는 것을 말한다.

주파수 변환을 찾았으니 이제 고역 통과 필터링, 이미지 재구성, 즉 역(inverse) DFT와 같은 주파수 영역의 기능을 할 수 있다. 이를 위해 60×60 크기의 직사각형 창으로 마스킹해서 낮은 주파수를 제거하기만 하면 된다. 그런 다음 np.fft.ifftshift() 함수를 사용하여 역방향 이동을 적용하여 DC 성분이 다시 왼쪽 상단에 오도록 한다. 그런 다음 np.ifft2() 함수를 사용하여 역 FFT를 찾는다. 결과는 다시 복잡한 숫자가 될 것이다. 이제 절대값을 취하면 된다.

rows,cols = img.shape # 소수점으로 떨어지는 것을 방지하기 위함 : round crow,ccol = round(rows/2), round(cols/2) # 60×60 크기로 창 만들기 fshift[crow-30:crow+60, ccol-30:ccol+30] = 0 f_ishift = np.fft.ifftshift(fshift) img_back = np.fft.ifft2(f_ishift) img_back = np.abs(img_back) plt.figure(figsize=(12,8)) plt.subplot(131),plt.imshow(img,cmap=’gray’) plt.title(“Input Image”), plt.axis(‘off’) plt.subplot(132),plt.imshow(img_back,cmap=’gray’) plt.title(“Image after HPF”), plt.axis(‘off’) plt.subplot(133),plt.imshow(img_back) plt.title(“Result in JET”), plt.axis(‘off’) plt.show()

결과는 아래와 같다.

결과를 보면 HPF(High Pass Filtering)가 가장자리 검출 역할을 한다는 것을 알 수 있다. 이는 Image Gradient 장에서 봤었던 것이다. 이는 또한 대부분의 이미지 데이터가 스펙트럼의 저주파 영역에 존재한다는 것을 보여준다. 어쨌든 Numpy에서 DFT, IDFT 등을 찾는 법을 보았다. 이제 OpenCV에서 어떻게 하는지 보자!

결과를 자세히 봤다면, 마지막 결과인 JET 색버전에서 몇 가지 인공물(artifacts)를 볼 수 있다. 이는 구조가 거기 있듯이 잔물결을 보여준다. 그리고 이를 Ringing Effects라고 부른다. 이는 우리가 마스킹하는데 사용한 직사각형 창에 의해 발생한다. 이 마스크는 이 문제를 일으키는 sinc 모양으로 변환된다. 그래서 직사각형 창은 필터링에 적용되지 않는다. 더 나은 방법은 가우시안 창을 이용하는 것이다.

Fourier Transform in OpenCV

OpenCV는 이를 위한 cv2.dft()와 cv2.idft() 함수를 제공한다. 이는 이전과 같은 결과를 돌려주지만, 두 개의 채널을 가지고 있다. 처음 채널은 결과의 실제 부분을 담당하고, 두 번째 채널은 결과의 상상의 부분을 맡는다. 입력 이미지는 np.float32로 변환되어져야 한다. 어떻게 하는지 봐보자!

img = cv2.imread(‘./images/face2.jpg’,0) dft = cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft) magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1])) plt.subplot(121), plt.imshow(img,cmap=’gray’) plt.title(“Input Image”), plt.axis(‘off’) plt.subplot(122), plt.imshow(magnitude_spectrum,cmap=’gray’) plt.title(“Magnitude Spectrum”), plt.axis(‘off’) plt.show()

결과는 당연히 같다!

** 한 번에 크기와 위상을 반환하는 cv2.cartToPolar()를 사용할 수 있다.

이제 역 DFT를 구해야한다, 이전 파트에서는 HPF를 생성했고, 이번에는 이미지에서 고주파 부분을 제거하는 방법, 즉 영상에 LPF를 적용하는 방법을 살펴보자. 이는 사실 이미지를 흐리게 한다. 이를 위해 먼저 저주파에서는 높은 값(1)으로 마스크를 생성한다. 즉 LF를 통과하고 HF 지역에서는 0을 통과한다.

rows, cols = img.shape crow,ccol = round(rows/2), round(cols/2) # 마스크를 먼저 생성하고, 가운데 네모를 1로 나머지를 0으로 한다. mask = np.zeros((rows,cols,2),np.uint8) mask[crow-30:crow+30,ccol-30:ccol+30] = 1 # 마스크와 역 DFT를 적용한다. fshift = dft_shift*mask f_ishift = np.fft.ifftshift(fshift) img_back = cv2.idft(f_ishift) img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1]) plt.figure(figsize=(12,8)) plt.subplot(121), plt.imshow(img,cmap=’gray’) plt.title(“Input Image”), plt.axis(‘off’) plt.subplot(122), plt.imshow(img_back,cmap=’gray’) plt.title(“Magnitude Spectrum”), plt.axis(‘off’) plt.show()

결과를 보자.

** 보통, OpenCV의 cv2.dft()와 cv2.idft() 함수는 Numpy 보다 빠르다. 하지만 Numpy 함수는 좀 더 유저친화적이다. 성능에 관한 세부적인 내용은 아래 섹션을 보자.

Performance Optimization of DFT

DFT 연산의 성능은 일부 배열 크기에서 더 좋다. 이는 배열의 크기가 2배 일 때 더 빠르다. 배열의 크기가 2배, 3배, 5배인 경우도 효율적이다. 코드의 성능에 대해 걱정이라면, 배열의 크기를 DFT를 찾기 이전에 어떠한 최적의 크기(제로-패딩으로)로 수정하면 된다. OpenCV에서는, 직접 제로패딩을 해야한다. 하지만 Numpy에서는, FFT 계산의 새 크기를 지정하면 자동으로 0이 패딩된다.

그러면 최적의 크기를 어떻게 찾을 수 있을까? OpenCV는 이를 위한 함수인, cv2.getOptimalDFTSize()를 제공한다. 이는 cv2.dft()와 np.fft.fft2() 모두에 적용된다. IPython의 마법같은 명령어인 %timeit을 사용해서 성능을 확인해보자.

img = cv2.imread(‘./images/face2.jpg’,0) rows,cols = img.shape print(rows,cols) # 501 398 nrows = cv2.getOptimalDFTSize(rows) ncols = cv2.getOptimalDFTSize(cols) print(nrows,ncols) # 512 400

보면, 크기 (501, 398)이 (512, 400)으로 수정된다. 이제 제로 패딩을 해보고 DFT 연산 성능을 찾아보자. 커다란 0 배열을 만들어도 되고 데이터를 복사하고 cv2.copyMakeBorder()를 사용해도 된다.

nimg = np.zeros((nrows,ncols)) nimg[:rows,:cols] = img

또는

right = ncols – cols bottom = nrows – rows bordertype = cv2.BORDER_CONSTANT nimg = cv2.copyMakeBorder(img,0,bottom,0,right,bordertype, value=0)

이제 Numpy 함수의 DFT 성능을 비교해보자.

>>>%timeit fft1 = np.fft.fft2(img) 71.4 ms ± 1.62 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) >>>%timeit fft2 = np.fft.fft2(img,[nrows,ncols]) 8.1 ms ± 330 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

이는 4배 빠른 것을 보여준다. 이를 OpenCV 함수로도 해볼 것이다.

>>>%timeit dft1= cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT) 2.13 ms ± 101 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) >>>%timeit dft2= cv2.dft(np.float32(nimg),flags=cv2.DFT_COMPLEX_OUTPUT) 1.16 ms ± 69.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

이 또한 4배 빠른 것을 보여준다. OpenCV 함수가 Numpy 함수보다 3배정도 빠른 것을 볼 수 있다. 이는 역 FFT로 해도 비슷하다.

Why Laplacian is a High Pass Filter?

포럼에서도 비슷한 질문이 있었다. 그 질문은, 왜 Laplacian이 HPF인가? 왜 Sobel이 HPF인가? 이었다. 그리고 그것에 대한 첫 번째 대답은 Fourier Transform에 관한 것이다. 좀 더 큰 크기의 FFT를 위해 Laplacian의 Fourier Transform을 해봐라!

# 조정 파라미터 없는 간단한 평균 필터 mean_filter = np.ones((3,3)) # 가우시안 필터 만들기 x = cv2.getGaussianKernel(3,3) gaussian = x*x.T ## 다른 가장자리 검출 필터들 # x 방향으로의 Scharr scharr = np.array([[-3,0,3], [-10,0,10], [-3,0,3]]) # x 방향으로의 Sobel sobel_x = np.array([[-1,0,1], [-2,0,2], [-1,0,1]]) # y 방향으로의 Sobel sobel_y = np.array([[-1,-2,-1], [0,0,0], [1,2,1]]) # laplacian laplacian = np.array([[0,1,0], [1,-4,1], [0,1,0]]) filters = [mean_filter, gaussian, laplacian, sobel_x, sobel_y, scharr] filter_name = [‘mean_filter’, ‘gaussian’,’laplacian’, ‘sobel_x’, \ ‘sobel_y’, ‘scharr_x’] fft_filters = [np.fft.fft2(x) for x in filters] fft_shift = [np.fft.fftshift(y) for y in fft_filters] mag_spectrum = [np.log(np.abs(z)+1) for z in fft_shift] for i in range(6): plt.subplot(2,3,i+1), plt.imshow(mag_spectrum[i],cmap=’gray’) plt.title(filter_name[i]), plt.axis(‘off’) plt.show()

아래 결과를 보자.

이미지에서, 각 커널이 차단하는 주파수 영역과 통과되는 영역을 볼 수 있다. 이 정보로부터, 우리는 왜 각 커널이 HPF인지 LPF인지 말할 수 있다.

728×90

반응형

푸리에 변환(Fourier transform) (2)

우리는 앞서 푸리에 변환(Fourier transform)이 무엇이고 이를 유도하는 방법에 대해서 알아보았다. 사실 푸리에 변환을 사용하기에 이전 글의 유도과정은 전혀 중요하지 않다. 공대생의 입장에서 푸리에 변환은 주어진 신호를 주파수 영역에서 손쉽게 해석 및 처리하기 위한 도구라고만 알면 끝이다. 다만 이를 사용하는 입장에서 한번쯤은 의문을 가져볼만하다.

글로 풀어진 푸리에 변환의 해석이나 유도는 여러번 보아도 전혀 와닿지 않을 것이다. 과연 이것이 어떻게 우리의 연구나 과제에 도움이 되고 어떻게 사용할지는 실제 예를 통해서 습득하는 것이 가장 효과적이다( 적어도 공대생인 필자는 그랬다. ). 이제 좀 더 눈이 보이고 직관적인 예를 통해서 자세히 알아보고자 한다.

본 글에서는 다양한 신호 중에 영상을 이용한 푸리에 변환의 예를 다룰 예정이다.

1. 고역통과 및 저역통과 필터(High-pass filter & Low-pass filter)

일반적으로 고역통과 및 저역통과 필터는 다만 영상에서 쓰일 뿐만 아니라 신호의 주파수의 필터링이 필요한 전기적 장치에서 흔히 쓰이는 말이다(전자파나 음파 분야에서는 필터보다 여파기라는 단어를 쓴다.). 아무튼 영상처리에서는 아래와 같이 정의할 수 있다.

– 고역통과 필터: 신호의 주파수 중 기준값 이하의 주파수를 제거하고, 기준값 이상의 주파수를 통과시키는 필터

– 저역통과 필터: 신호의 주파수 중 기준값 이상의 주파수를 제거하고, 기준값 이하의 주파수를 통과시키는 필터

고역통과 및 저역통과 필터를 사용하기 위해서는 신호의 푸리에 변환을 통한 주파수 확인이 필요하다. 만약 아래와 같은 영상이 있을때, 영상의 푸리에 변환 후의 신호는 다음 그림과 같다. (대부분의 영상은 이차원이므로 이차원 푸리에 변환이 필요하다. 그리고 모든 영상 정보는 신호가 연속적이지 않기 때문에 불연속 푸리에 변환을 한다. 이차원 푸리에 변환과 불연속 푸리에 변환의 자세한 내용은 본 글에서 다루고자하는 핵심 내용에 벗어나기 때문에 다루지 않겠다. )

<고양이 '삼색이' 사진> <고양이 사진의 2차원 고속 푸리에 변환 후의 실수부분 영상>

영상을 푸리에 변환을 하면 주어진 영상과 동일한 크기의 주파수 정보를 얻을 수 있다. 이는 불연속적인 픽셀로 이루어진 영상은 최대 주파수가 영상의 크기에 의해서 결정되어지기 때문이다. 이제 주파수 정보를 자세히 보면 중심부(저주파수)가 상대적으로 높은 강도의 신호를 가지고 외부(고주파수)가 상대적으로 낮은 강도의 신호를 가지는 패턴 을 볼 수 있을 것이다. 이는 대부분의 영상에서 나타나는 패턴이다. 우리가 흔히 보는 영상이 대부분 저주파수로 이루어져 있음 을 알 수 있다.

<고역통과 필터>

자, 그럼 먼저 고역통과 필터를 적용해보자. 고역통과 필터는 아래와 같이 만들 수 있다. 기준값은 임의로 결정하였다.

<고역통과 필터>

위 그림에서 흰색 영역은 1을 가지고 검정 영역은 0을 가진다. 즉, 고역통과 필터와 영상의 원소 간의 곱 을 하면 중심부의 저주파수는 사라지고 외부에 상대적으로 고주파수만 남게 된다. 그 신호를 다시 푸리에 역변환을 거치면 아래와 같은 영상을 얻을 수 있다.

<고역통과 필터링 후의 삼색이 사진>

고양이 사진을 보면 경계부분과 상세한 모양은 남아있지만 그 경계를 채워주는 요소가 결여되어 있다. 이것이 고양이 영상에서의 고주파 신호이다. 그럼 저주파 신호는 어떨까?

<저역통과 필터>

위에서와 반대로 저역필터를 만들어준다. 앞서 설정한 기준값 이하의 부분은 1을 가지고 나머지는 0을 가지는 필터이다. 아래 만들어진 저역통과 필터를 푸리에 변환된 영상의 신호에 원소 간의 곱을 한 후에 푸리에 역변환을 하면 다음 고양이을 영상을 얻을 수 있다.

<저역통과 필터> <저역통과 필터링 후 삼색이 사진>

이번 영상을 어떤가? 굉장히 오래된 핸드폰으로 찍은 낮은 해상도 그림을 보는 것 같다고 생각하면 정확하게 본 것이다. 고주파 정보란 정해진 길이의 정보(예: 고양이 사진)에서 굉장히 많은 반복수를 가진 정보이다. 다른 말로 특정 공간에서 작게 분해된 정보이고 이런 정보가 많은 영상을 고해상도라고 말한다. 위 영상은 저역통과 필터로 인해서 고해상도가 대부분 사라졌기 때문에 저해상도 영상이다.

필자가 대학교 수업을 들을 때에 담당교수님께서 하신 말씀을 빌리자면,

셀카를 찍으면 얼굴이 부어보이는 이유는 아직 카메라의 해상도가 사람의 눈을 못 따라오기 때문에 카메라에 담기는 정보는 마치 저역통과 필터를 거친 영상이므로 경계부분이 뚜렷하지 않아 그렇게 보인다. 라고 하셨다.

(사실 요즘 카메라는 예전에 비해서는 많이 좋아져서 눈에 띌 정도의 저역통과 필터는 아닌 것 같다. 하하하)

한가지 재미있는 사실을 말해보자면 사람의 눈도 볼 수 있는 최대 주파수(혹은 해상도)가 있기 때문에 멀리있는 사물을 볼 때에는 대부분 저주파수만을 보는 것과 마찬가지이다. 고양이의 원본영상과 저역통과 필터를 거친 영상을 굉장히 축소시키면 멀리서 고양이를 보는 것과 유사한데, 멀어질수록 두 영상의 차이를 점점 구별하기 힘들어진다.

<원본 영상과 저역통과 필터를 거친 영상을 축소한 결과>

2. 주파수강조 필터 (Frequency-emphasizing filter)

주파수강조 필터는 많이들 고역통과 및 저역통과 필터와 혼용되어 불리는데 나는 이를 구분하고 싶다. 주파수강조 필터는 특정주파수를 제거하는 것이 아닌 각 주파수 별로 가중치를 곱하여 데이터를 처리하는 방법이다. 본 글에서는 간단하게 대표적인 몇가지에 대해서만 알아볼 예정이다.

<영상 미분(Image gradient)>

영상처리에 대해서 한번이라도 배운적이 있다면 영상 미분이라면 한번쯤 보았을 것이다. 하지만 이것은 단순히 인접하는 두 픽셀의 값을 빼는 것으로 푸리에 변환이랑은 무관하다. 그 식은 아래와 같다.

$$ \triangledown_{x} f_{x,y} = f_{x+1,y} – f_{x,y}$$

여기서 \( f_{x,y} \) 는 영상에서의 임의의 좌표를 의미하고 \( \triangledown_{x} \)는 x방향으로의 미분을 의미한다. 이는 푸리에 변환을 이용한 해석이 가능하다.

공간좌표계에서의 이동은 주파수좌료계에서 $$ \mathcal{F}\left\{f_{x+1,y}\right\} = e^{-i(2\pi) u}\mathcal{F}\left\{f_{x,y}\right\} $$ 이므로

$$ f_{x+1,y} – f_{x,y} = \mathcal{F}^{-1}\left\{(e^{-i(2\pi) u}-1)\mathcal{F}\left\{f_{x,y}\right\}\right\} = \mathcal{F}^{-1}\left\{(\cos (2\pi u)-1-i \sin (2\pi u))\mathcal{F}\left\{f_{x,y}\right\}\right\}$$ 이다 (exponential 함수에서 삼각함수로의 변환은 오일러공식을 통해 가능하다.).

여기서 \( \cos (2\pi u)-1-i \sin (2\pi u) \) 가 영상의 푸리에 변환 후에 곱해지는 주파수 가중치이다. 복소수를 포함하고 있기 때문에 이에 절대값을 취하여 가중치의 크기만을 확인하면 다음과 같다.

$$ |\cos (2\pi u)-1-i \sin (2\pi u)| = 2 – 2\cos (2\pi u)$$

이를 그래프를 그려서 확인하면 낮은 주파수부터 가장 높은 주파수까지 점차 가중치가 상승하는 모양이다(아래 u축의 값은 신경쓰지말고 가중치가 0인 부분을 가장 낮은 주파수로 생각하면 된다.).

<주파수 영역에서의 영상 미분처리의 가중치>

즉, 영상 미분은 주파수가 0인 부분을 제거하고 고주파수를 상대적으로 증폭시키는 고주파수강조 필터이다.

<램프 필터(Ramp filter)>

영상 재건에 관심이 있다면 램프 필터를 본 적이 있을 것이다. CT와 같은 의료영상이나 그 외 회전하면 촬영하는 영상 시스템에서 많이 사용되는데, 1차원 영상을 2차원 단면영상으로 해석적으로 재건할 때에 램프필터링 후 각 영상을 합성하게 된다. 램프필터는 단순히 영상을 주파수 영역으로 변환한 뒤에 \( |u| \) 를 곱한 것이다. 이는 주파수영역에서 아래 그림과 같이 표현할 수 있다.

<주파수 영역에서의 램프 필터의 가중치> <램프필터링된 삼색이 사진>

램프필터와 같이 특정주파수 강조 필터들은 주파수를 제거하는 것이 아니고 상대적인 비율을 조절하는 것이라 고역통과 및 저역통과 필터보다 훨씬 자연스러운 이미지가 나온다. 하지만 느낌은 다르다.

이것 외에도 영상처리에서 푸리에 변환을 이용하는 경우가 무수히 많다. 본 글에서는 간단히 응용되는 예를 살펴보았다. 이 후 글에서는 좀 더 구체적인 사례들을 알아보고자 한다.

※ 본 글은 필자가 공부를 하며 얻은 이해를 바탕으로 적은 글이므로 다소 해석의 오류가 있을 수 있습니다. 글이 도움이 되었다면 하트 클릭 부탁드립니다 🙂 (비로그인으로도 가능합니다.)

주파수 분석을 통한 가짜 이미지의 식별

인공지능 합성 이미지(deep-fake image)는 믿을 수 없을 정도로 진짜같아 보이지만 실은 컴퓨터에 의해 만들어졌다. 이 이미지들은 머신러닝 알고리즘에 의해 만들어졌고 사람들은 이를 실제 사진과 잘 구분해내지 못한다. Ruhr-Universitat Bochum의 Horst Gortz Institute IT 보안 연구소와 Cyber Security in the Age of Large-Scale Adversaries (Casa)의 연구원들은 인공지능 합성 이미지를 효과적으로 식별해내는 새로운 방법을 개발해냈다. 이것을 위하여 그들은 신호 처리 기술을 확립하였고 주파수 영역에서 물체를 분석하였다.

이팀은 2020년 7월 15일 머신러닝 분야에서 대표적인 학회 중 하나인 국제 머신러닝 학회 (ICML)에서 그들의 결과를 보여주었다. 추가적으로 연구진들은 그들의 코드를 온라인 https://github.com/RUB-SysSec/GANDCTAnalysis에 무료로 사용할 수 있게 공개하여 다른 사람들이 그들의 결과를 활용하여 또 다른 결과를 만들어낼 수 있게 하였다.

두 개의 알고리즘의 상호작용이 새로운 이미지를 만들어낸다.

인공지능 합성 이미지는(deep-fake image, 머신러닝의 “딥러닝”과 “가짜”로부터 만들어진 단어) Generative Adversarial Netarks (GANs)라 불리는 컴퓨터 모델의 도움으로 만들어졌다. 이 네트워크에서 두 개의 알고리즘은 같이 작동한다. 첫 번째 알고리즘은 특정 입력 데이터에 의거하여 임의의 이미지를 생성한다. 두 번째 알고리즘은 이미지가 가짜인지 아닌지를 결정한다. 이미지가 가짜임이 결정되면 두 번째 알고리즘은 첫번째 알고리즘에게 해당 이미지가 더 이상 가짜로 인지하지 못할 때까지 이미지를 수정하라고 명령한다.

최근에 이 기술은 인공지능 합성 이미지를 더욱 더 진짜같이 만드는데 일조했다. www.whichfaceisreal.com웹사이트에서 사용자들은 실제 사진으로부터 가짜를 구별해낼 수 있는지 확인할 수 있다. “가짜 뉴스의 시대에 사용자가 컴퓨터가 만들어낸 가짜 이미지와 진짜 이미지를 구별해 낼 능력이 없다는 것은 문제이다.” 라고Chair for Systems Security의 Thorsten Holz 교수는 말했다.

Bochum의 연구진들은 그들의 분석에 있어서 위에서 언급된 “어떤 얼굴이 진짜일까요” 사이트의 기본을 만드는 데이터 세트를 사용했다. 이러한 학제간 프로젝트에서 Chair for Systems Security의 Joel Frank, Thorsten Eisenhofer, 그리고 Thorsten Holz 교수가 Chair of Machine Learning의 Asja Fischer뿐만 아니라, Chair of Digital Signal Processing의 Lea Schonherr와 교수 Dorothea Koloss와 협업했다.

주파수 분석은 전형적인 인공물을 드러낸다.

지금까지 인공지능 합성 이미지는 복잡한 통계적 방법을 이용하여 분석되었다. Bochum 그룹은 분리된 코사인 변형을 사용하여 이미지를 주파수 범위로 변환하는 기존과는 다른 접근방식을 사용했다. 따라서 생성된 이미지는 다양한 코사인 함수의 합으로 표현된다. 가짜가 아닌 원본 이미지는 낮은 주파수 함수로 구성된다.

GANs를 통해 만들어진 가짜 이미지는 높은 주파수 범위에 인공물이 보여지는 것을 보여주었다. 예를 들어 가짜 이미지의 주파수 표현에는 전형적인 격자 구조가 나타난다. “우리의 연구는 이러한 인공물이 GANs에 의해 생성된 가짜 이미지에만 발생하는 것이 아니라는걸 보여준다. 인공물이 나타나는 것은 모든 딥러닝 알고리즘에서 나타나는 구조적 문제이다.” 라고 Chair for Systems Security의 Joel Frank가 말했다. “우리의 연구에 사용된 인공물은 이미지가 머신러닝을 통해 만들어진 인공지능 합성 이미지인지 아닌지를 항상 구분해내 줄 것이다. 따라서 주파수 분석은 컴퓨터로 만들어진 이미지를 자동적으로 식별하는 데 효과적인 방법이다.”라고 Frank가 덧붙였다.

소스: 원문은 Ruhr-University Bochum에서 제공되었습니다.

키워드에 대한 정보 이미지 주파수 분석

다음은 Bing에서 이미지 주파수 분석 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 5분만에 이해해보는 푸리에 변환

  • 공돌이
  • 수학
  • 공업수학
  • 공수
  • 선형대수
  • math
  • linear
  • algebra
  • 수학1
  • 미적분
  • 미분
  • 적분

5분만에 #이해해보는 #푸리에 #변환


YouTube에서 이미지 주파수 분석 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 5분만에 이해해보는 푸리에 변환 | 이미지 주파수 분석, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  무료 영화 드라마 쿠쿠 티비 | 쿠쿠 티비 Qooqootv 드라마 예능 Tv 한국영화 다시보기 무료사이트 Https B3 Qooqootv App 16 개의 베스트 답변

Leave a Reply

Your email address will not be published. Required fields are marked *