이미지 / 사진에서 주파수가 어떻게 정의되는지 이해하지 못합니다. 내가 지금까지 이해하는 한, 고주파는 가장자리와 같은 이미지의 날카로운 것과 같으며 저주파수는 그 반대입니까?
또한 이산 푸리에 변환의 결과를 올바르게 읽는 방법과 같은 결과를 이해하고 싶습니다.
누군가 나에게 다음을 설명 할 수 있다면 좋을 것입니다.
사진의 주파수는 무엇이며 어떻게 정의됩니까?
이산 푸리에 변환의 결과를 어떻게 읽습니까?
이미지 / 사진에서 주파수가 어떻게 정의되는지 이해하지 못합니다. 내가 지금까지 이해하는 한, 고주파는 가장자리와 같은 이미지의 날카로운 것과 같으며 저주파수는 그 반대입니까?
또한 이산 푸리에 변환의 결과를 올바르게 읽는 방법과 같은 결과를 이해하고 싶습니다.
누군가 나에게 다음을 설명 할 수 있다면 좋을 것입니다.
사진의 주파수는 무엇이며 어떻게 정의됩니까?
이산 푸리에 변환의 결과를 어떻게 읽습니까?
답변:
나는 첫 번째 질문에 답할 것입니다 : 이미지의 주파수는 무엇입니까?
푸리에 변환은 동일한 이미지 정보가 각 픽셀에 대해 개별적으로 표시되는 것이 아니라 각 주파수에 대해 표현되는 수학적 기법입니다. 이런 식으로 생각하십시오. 바다에는 파도가 매우 느리게 움직이고 (조류처럼), 다른 파도는 중간 크기이며, 다른 파도는 돌풍으로 형성된 잔물결처럼 작습니다. 당신은 그것들을 세 개의 분리 된 파도로 생각할 수 있지만, 바다 표면의 각 지점과 순간에 단 하나의 물 높이를 얻습니다.
이미지에도 동일하게 적용됩니다. 이미지가 다양한 파도 나 주파수로 구성되어 있다고 생각할 수 있습니다. 이미지를 만들려면 평균 색상으로 시작하십시오 (실제로 그레이 스케일 이미지를 생각하는 것이 더 쉽습니다). 그런 다음 다른 파장과 강도의 파도를 추가하여 그림에 세부 묘사를 천천히 만듭니다.
소스 이미지 :
첫 번째 빈도 (평균) :
수직 치수를 따르는 두 번째 주파수는 이미지 하단에서 0에서 시작하여 상승하여 중앙 수평선을 따라 다시 0이되고 0 아래로 떨어지면서 이미지 상단에서 0이됩니다. (위상 시프트가없는 푸리에 시리즈를 설명했지만 그 비유는 여전히 유효합니다.)
여기에서 수평 및 수직을 따라 두 번째 주파수를 볼 수 있습니다. 산이 어두워지는 곳과 하늘과 호수가 어두워지는 곳을 알아볼 수 있습니다.
두 번째 빈도 :
각각의 추가 파동 또는 주파수는 더 많은 잔물결을 가져오고 더 자세하게 나타납니다. 다른 이미지를 얻기 위해 웨이브 높이 / 진폭과 웨이브 시작점 (위상이라고도 함)을 변경할 수 있습니다.
세 번째 빈도 :
흥미롭게도 정보량은이 표현에서 동일하며 일반 이미지 (공간 도메인)와 푸리에 변환 이미지 (주파수 도메인) 사이를 오갈 수 있습니다. 주파수 영역에서는 진폭과 위상 정보와 함께 모든 주파수의 정보를 유지해야합니다.
여기서는 주파수의 50 %를 사용합니다.
푸리에 시리즈, 푸리에 변환 및 이산 푸리에 변환 및 이산 코사인 변환 (DCT)으로 구분되는이 모든 변형이 있습니다.
흥미로운 응용 프로그램 중 하나는 JPEG와 같은 압축 알고리즘을 사용하는 것입니다. 여기서 DCT는 이미지의 중요한 부분 (저주파)을 많이 저장하고 고주파수를 줄이는데 사용됩니다.
나는 이것을 초보자 독자들이 푸리에 변환 (Fourier Transforms)의 개념에 대한 기본적인 이해를 얻을 수 있기를 바랍니다. 이를 위해 좀 더 단순화 된 독자들이 나를 용서해주기를 간구했습니다.
Thomas Devoogdt가 생성 한 비디오는 Vimeo 에서 볼 수 있습니다 .
포스트 프로세싱을 위해 주파수에 의존하는 수많은 방법이 있습니다. 대부분 단일 픽셀을 개별적으로 보지 않기 때문입니다. 이런 식으로 생각하는 것이 더 자연 스럽기 때문에 많은 알고리즘이 주파수에서 작동합니다. 또한 푸리에 변환에는 동일한 정보가 포함되므로 주파수와 공간 영역에서 수학 연산 (또는 사후 처리 단계)을 표현할 수 있습니다! 때로는 픽셀 단위의 설명이 더 좋지만 주파수 설명이 더 낫습니다. (이 맥락에서 더 나은 것은 주로 더 빠릅니다.)
주파수를 직접 사용하는 아티스트이고 주파수 분리 *라는 점을 제외하고는 특별한 이유없이 지적하고자하는 기술 중 하나입니다. 나는 그것을 설명하지 않을 것이지만 당신은 그것이 포토샵과 김프 모두를 위해 YouTube에서 어떻게 작동하는지 볼 수 있습니다.
하나는 낮은 주파수와 하나는 높은 주파수의 레이어를 만듭니다. 인물 사진의 경우 저주파수의 피부 톤에 영향을주지 않고 고주파수에서 피부를 부드럽게 할 수 있습니다.
위의 예제를 생성하는 코드입니다. 간단한 파이썬 프로그램으로 실행할 수 있습니다.
from PIL import Image
from numpy.fft import rfft2, irfft2
import numpy as np
def save_dims(ft, low, high, name):
ft2 = np.zeros_like(ft)
# copy the frequencies from low to high but all others stay zero.
ft2[low:high, low:high] = ft[low:high, low:high]
save(ft2, name)
def save(ft, name):
rft = irfft2(ft)
img = Image.fromarray(rft)
img = img.convert('L')
img.save(name)
def main():
# Convert input into grayscale and save.
img = Image.open("input.jpg")
img = img.convert('L')
img.save('input_gray.png')
# Do Fourier Transform on image.
ft = rfft2(img)
# Take only zeroth frequency and do Inverse FT and save.
save_dims(ft, 0, 1, 'output_0.png')
# Take first two frequencies in both directions.
save_dims(ft, 0, 2, 'output_1.png')
save_dims(ft, 0, 3, 'output_2.png')
# Take first 50% of frequencies.
x = min(ft.shape)
save_dims(ft, 0, x/2, 'output_50p.png')
def generateGif():
''' Generates images to be later converted to a gif.
This requires ImageMagick:
convert -delay 100 -loop 0 output_*.png animation.gif
'''
# Requires images2gif from code.google.com/p/visvis/source/browse/vvmovie/images2gif.py
# from images2gif import writeGif
img = Image.open('input.jpg')
img = img.convert('L')
# Resize image before any calculation.
size = (640,480)
img.thumbnail(size, Image.ANTIALIAS)
ft = rfft2(img)
images = []
for x in range(0, max(ft.shape)):
ft2 = np.zeros_like(ft)
ft2[0:x, 0:x] = ft[0:x,0:x]
rft = irfft2(ft2)
img_out = Image.fromarray(rft).convert('L')
fname = 'animation/output_%05d.jpg' %(x, )
img_out.save(fname, quality=60, optimize=True)
#writeGif('animation.gif', images, duration=0.2)
if __name__=='__main__':
main()
#generateGif()
가능한 가장 간단한 수학 용어로 설명하려고 노력할 것입니다. 수학을 건너 뛰려면 II 부로 넘어가십시오. 짧은 답변을 받으려면 III 부로 건너 뛰십시오.
1 부
신호의 주파수는 단위 시간당 반복 이벤트 발생 횟수를 의미합니다. 따라서 시간 단위가 초이면 주파수는 Herz : 1Hz = 1 / s로 측정됩니다. 따라서 100Hz의 신호에는 초당 100 회 반복되는 패턴이 있습니다.
가장 기본적인 신호 (신호 처리 관점에서)는 부비동 신호입니다.
y (t) = sin (2πft)
여기서 f는이 부비동 신호의 주파수이고 t는 시간입니다. 이 신호가 울리고 f가 약 50Hz 인 경우 매우 낮은 저음이 들립니다. 15kHz와 같은 더 높은 주파수에서는 더 높은 톤이됩니다.
개념을 일반화하기 위해 신호는 시간 신호 대신 공간 신호가 될 수 있습니다. 종이에 사인파를 그리는 것처럼 x라는 축이 오른쪽을 가리키고 y 축이 수직 인 것처럼 x 축에
y (x) = sin (2πfx)
여기서 f는 신호의 주파수이고 x는 공간 변수입니다. 여기서 f는 더 이상 1 / s로 측정되지 않고 1 / (공간 단위)로 측정됩니다.
프랑스 수학자 푸리에 (Fourier)는 진폭과 주파수가 다른 여러 사인 및 코사인 신호를 추가하여 모든 신호를 생성 할 수 있음을 보여주었습니다. 이를 푸리에 분석이라고합니다.
푸리에 분석을 사용하면 다른 주파수를 가진 사인 및 코사인 신호의 합으로 함수 y (x)를 작성할 수 있으므로 주파수 y (f)와 관련된 여러 함수의 관점에서 함수 y (x)를 다시 작성할 수 있습니다. y (x) = Some_Function (Y (f))라고 말할 수 있습니다. 또는 Y (f) = 역순 함수 (y (x))
푸리에 변환은 x 도메인에서 주파수 도메인으로 신호를 변환하는 함수 F입니다.
Y(f) = F( y(x) )
y(x) = F_inv(Y(f))
F는 아날로그 함수, 이산 푸리에 변환 DFT는 F의 수치 근사치입니다. 고속 푸리에 변환 FFT는 속도에 최적화 된 DFT를 수행하는 방법입니다.
확인...
2 부
이제 컴퓨터 이미지는 픽셀로 구성되며 모든 픽셀의 RGB 값은 빨강, 녹색, 파랑의 강도 값입니다. 그레이 스케일 이미지에서 모든 픽셀의 R, G, B의 강도는 동일합니다. R = G = B = I이므로 그레이 스케일 이미지의 I에 대해 이야기 할 수 있습니다.
아래의 800px X 100px 회색조 그림은 f = 1 반복 / 800px = 0.00125 반복 / px로 I (x) = sin (2πfx)를 사용하여 생성되었습니다.
Python3으로 직접 생성 할 수 있습니다
from PIL import Image, ImageDraw
from math import sin, pi
img = Image.new('RGB', (800,100), color='black')
draw = ImageDraw.draw(img)
#cacluate the frequency
n = 10 #repetitions
f = n/img.width #
#iterate of the width pixels
for x in range(img.width):
#calculate the intensity i in that pixel x
y = sin(2*pi*f*x - pi/2) #this will generate values between -1 and +1, -pi/2 is to make sure that i starts with value 0 in the next line.
i = (255+255*y)/2 #shifting and scaling y so that the values are between 0 and 255
draw.line((i,0,i,img.height), fill=(int(i),int(i),int(i)))
img.show()
아래 800px X 100px 회색조 그림은 f = 10repetitions / 800px = 0.0125 repetitions / px (I = x) = sin (2πfx)을 사용하여 생성되었습니다.
이제이 이미지의 가로 주파수가 10이라는 것을 쉽게 알 수 있습니다. n = 100이되도록 주파수를 10 배 늘립니다. f = 100/800 = 1/8 = 0.125 반복 / px :
앞에서 언급했듯이 모든 신호 (1D 회색조 이미지)를 다른 주파수를 가진 일련의 사인 신호 (1D 회색조 사인 이미지)로 나타낼 수 있습니다.
3 부
따라서 A에 "세밀한"세부 사항이있는 경우 1D 회색조 이미지 A는 다른 회색조 이미지 B보다 높은 주파수를 갖습니다.
이 원리를 컬러 2D 및 3D 이미지로 일반화 할 수 있습니다. 이미지의 "세부 사항"이 미세할수록 해당 이미지의 주파수 내용이 높아집니다.
따라서 푸른 하늘은 꽃의 이미지와 비교하여 빈도가 낮습니다.
푸리에 분석 및 디지털 이미지 처리에 대해 읽으면 이에 대해 자세히 알아볼 수 있습니다.
간단히 말해 빈도는 변화율을 나타냅니다. 보다 정확하게, 주파수는 변화 주기 의 역수 , 즉 하나의 밝기 (또는 무엇이든)에서 다른 밝기로 순환하는 데 걸리는 시간입니다. 그런 다음 더 빠르게 변경 (예 : 밝은 것에서 어두운 것으로)할수록 이미지의 해당 부분을 나타내는 데 필요한 시각적 "주파수"가 높아집니다.
즉, 이미지의 빈도를 변화율로 생각할 수 있습니다. 한 색상에서 다른 색상으로 빠르게 변하는 이미지 부분 (예 : 날카로운 모서리)에는 고주파가 포함되며 점차적으로 변하는 부분 (예 : 단색의 큰 표면)에는 낮은 주파수 만 포함됩니다.
DCT 및 FFT 및 기타 유사한 변환에 대해 이야기 할 때 일반적으로 이미지의 일부 (예 : JPEG 압축, 가장자리 감지 등)에서 변환을 수행합니다. 주어진 크기 의 변환 블록 과 관련하여 변환에 대해 이야기하는 것이 가장 합리적 입니다.
32 픽셀 x 32 픽셀 블록의 이미지 데이터를 상상해보십시오. (이 숫자는 임의적입니다.) 이미지가 왼쪽에 흰색, 중간에 검은 색, 오른쪽에 흰색 인 단순 그라디언트라고 가정하십시오. 이 신호는 32 픽셀의 폭마다 흰색에서 검은 색으로, 흰색에서 완전한주기를 거치기 때문에 폭이 32 픽셀 당 대략 하나의 파장 인주기를가집니다.
우리는이 주파수를 임의로 "1"이라고 부를 수 있습니다. 나는 이것이 변형 교과서에서 아마도 θ 또는 θ / 2라고 일반적으로 기억하지만 잘못 기억하고있을 수 있습니다. 어느 쪽이든, 우리는 이것을 1이라고 부를 것입니다. 왜냐하면 이것은 절대적으로 절대적인 의미이기 때문입니다. 중요한 것은 상대적인 의미에서 주파수 사이의 관계입니다. :-)
한 쪽 가장자리에 흰색 인 두 번째 이미지가 있고 다른 쪽 가장자리에 흰색에서 검은 색, 흰색, 검은 색으로 다시 흰색으로 바뀌도록 빠르게 두 번 이미지가 바뀐다 고 가정합니다. 그런 다음 해당 주파수를 "2"라고 부릅니다. 32 픽셀 블록 너비보다 두 배 자주 변경되기 때문입니다.
간단한 이미지를 재현하려면 문자 그대로 모든 행이 주파수가 1 또는 2 인 신호로 구성되어 있으며 이미지의 모양을 알 수 있습니다. 이미지가 검은 색에서 50 % 회색으로 바뀐 경우 동일한 작업을 수행 할 수 있지만 50 % 강도에서 1 또는 2의 주파수를 가졌다 고 말해야합니다.
물론 실제 이미지는 단순한 그라디언트가 아닙니다. 왼쪽에서 오른쪽으로 스캔하면 이미지가 자주 바뀌지 않고 주기적으로 바뀝니다. 그러나 작은 블록 (예 : 8 픽셀, 16 픽셀) 내에서 행의 픽셀 값의 평균부터 시작하여 " 주파수 0.5 "신호 (한쪽에 검은 색, 흰색으로 희미 해짐) 혼합 (또는 음의 양, 빼는 신호의 양), 그 후 주파수 1, 주파수 2, 주파수 4 등의 양 .
이제 이미지는 양방향으로 주파수가 있다는 점에서 독특합니다. 수평 및 수직으로 움직일 때 더 밝고 어두워 질 수 있습니다. 이러한 이유로 1D 대신 2D DCT 또는 FFT 변환을 사용합니다. 그러나 원리는 여전히 기본적으로 동일합니다. 비슷한 크기의 버킷으로 구성된 8x8 격자로 8x8 이미지를 정확하게 표현할 수 있습니다.
이미지는 색상으로 인해 더 복잡하지만 현재는이를 무시하고 사진의 빨간색 채널을 격리하여 볼 때 얻을 수있는 단일 그레이 스케일 이미지 만보고 있다고 가정합니다.
변환 결과를 읽는 방법은 1D 변환인지 2D 변환인지에 따라 다릅니다. 1D 변환의 경우 일련의 구간이 있습니다. 첫 번째는 모든 입력 값의 평균입니다. 두 번째는 추가 할 주파수 1 신호의 양이고, 세 번째는 추가 할 주파수 2 신호의 양입니다.
2D 변환의 경우 n x n 격자 값이 있습니다. 왼쪽 상단은 일반적으로 평균이며 수평 방향으로 갈 때 각 버킷에는 1, 2, 4 등의 수평 주파수와 혼합 할 신호 량이 포함되며 수직 방향으로 갈 때 수직 주파수 1, 2, 4 등과 혼합 할 신호의 양입니다.
물론 DCT에 대해 이야기하고 있다면 완전한 이야기입니다. 반대로, FFT의 각 빈에는 실제 및 가상 부품이 포함됩니다. FFT는 주파수가 빈에 매핑되는 방식이 다르고 수학이 더 복잡하다는 점을 제외하고는 여전히 동일한 기본 아이디어 (정렬)를 기반으로합니다. :-)
물론 이러한 종류의 변환을 생성하는 가장 일반적인 이유는 한 단계 더 나아가 데이터 일부를 버리는 것입니다. 예를 들어 DCT는 JPEG 압축에 사용됩니다. 왼쪽 상단 (평균)에서 시작하여 오른쪽 하단으로 이동하는 지그재그 패턴의 값을 읽으면 가장 중요한 데이터 (평균 및 저주파수 정보)가 먼저 기록 된 다음 점차적으로 높은 주파수 데이터가 기록됩니다. 어떤 시점에서, 당신은 기본적으로 "충분하다"고 말하고 가장 높은 빈도의 데이터를 버립니다. 기본적으로 미세한 디테일을 제거하여 이미지를 부드럽게하지만 여전히 정확한 이미지를 제공합니다.
또한 IIRC, FFT는 종종 에지 감지에 사용되며, 날카로운 에지에서 고 대비 영역을 감지하는 수단으로 고주파수 성분을 제외한 모든 컴포넌트를 버립니다.
내쇼날 인스트루먼트에는 이를 그림으로 설명 하는 멋진 기사 가 있습니다. :-)
광전지를 사용하여 이미지를 한 줄씩 스캔하고 결과를 플로터 (종이에 검은 색 물결을 만드는 평면 기계), 오실로스코프 (화면에 녹색 물결 모양을 만드는 상자) 또는 스펙트럼 분석기 ( 녹색 또는 멀티 컬러 울타리 만들기). 또는 스피커조차도. 이미지의 구조가 미세할수록 표시 / 들어간 신호의 주파수 (라우드 스피커의 피치)가 높아집니다. 미세 구조에 대비가 많을수록 신호의 고주파 부분의 진폭이 높아집니다.