Python 다운샘플 어레이

Muhammad Maisam Abbas 2023년10월10일
  1. Python3에서 슬라이싱으로 어레이 다운샘플링
  2. Python에서 zoom() 함수를 사용하여 배열 다운샘플링
  3. Python에서 block_reduce() 함수를 사용하여 배열 다운샘플링
Python 다운샘플 어레이

이 자습서에서는 Python에서 이미지를 다운 샘플링하는 방법에 대해 설명합니다.

Python3에서 슬라이싱으로 어레이 다운샘플링

파이썬에서 이미지는 다차원 배열입니다. 회색조 이미지는 2차원 배열로 표현되는 반면 컬러 또는 RGB 이미지는 3차원 배열로 표현됩니다.

단순함을 위해 이 자습서에서는 2차원 회색조 이미지의 크기를 줄이는 데 중점을 두지만 여기에서 설명하는 방법을 사용하여 RGB 이미지의 크기를 줄일 수도 있습니다.

첫 번째 방법은 매우 간단합니다. 슬라이싱에서는 이름에서 알 수 있듯이 전체 큰 이미지에서 작은 조각을 가져옵니다.

이미지를 자르는 동안 다음 값을 가져오기 전에 건너뛸 값을 지정하는 단계 매개 변수를 제공할 수 있습니다. 기본적으로 이 값은 1로 설정됩니다.

다음 코드 예제는 배열 슬라이싱을 사용하여 이미지를 다운 샘플링하는 방법을 보여줍니다.

import numpy as np

b = np.arange(0, 100)
c = b.reshape([10, 10])
print("Original Array:")
print(c)
print("Downsized Array:")
print(c[::2, ::2])

출력:

Original Array:
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 0  2  4  6  8]
 [20 22 24 26 28]
 [40 42 44 46 48]
 [60 62 64 66 68]
 [80 82 84 86 88]]

위 섹션에 작성된 코드는 원본 이미지 c의 크기를 (10, 10)에서 (5, 5)로 줄이고 new_c에 저장합니다.

주목해야 할 중요한 점은 이 방법이 원래 100개의 값에서 25개의 값을 선택했다는 것입니다. 나머지 값의 정보는 이 방법에서 완전히 손실됩니다.

Python에서 zoom() 함수를 사용하여 배열 다운샘플링

ndimage.interpolation.zoom() 함수는 Python에서 이미지를 업샘플링하거나 다운샘플링하는 데에도 사용됩니다. 이 함수는 2개의 매개변수를 사용합니다. 줌이 필요한 원본 이미지와 줌 비율.

이 방법은 슬라이싱 방법과 매우 유사합니다. 또한 중간 값을 건너뛰고 다운 샘플링하는 동안 원본 이미지에서 몇 가지 값만 선택합니다.

다음 코드 예제는 ndimage.interpolation.zoom() 함수를 사용하여 이미지를 다운 샘플링하는 방법을 보여줍니다.

import numpy as np
from scipy import ndimage

b = np.arange(0, 100)
c = b.reshape([10, 10])

new_c = ndimage.interpolation.zoom(c, 0.5)
print("Original Array:")
print(c)
print("Downsized Array:")
print(new_c)

출력:

Original Array:
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 0  2  4  6  8]
 [20 22 24 26 28]
 [40 42 44 46 48]
 [60 62 64 66 68]
 [80 82 84 86 88]]

위 섹션에 작성된 코드는 이전 예제와 동일한 방식으로 작동하며 원본 이미지 c의 크기를 (10, 10)에서 (5, 5)로 줄입니다.

이 방법은 이미지를 업샘플링하는 데에도 사용할 수 있기 때문에 단순한 슬라이싱보다 낫습니다. 1보다 큰 확대/축소 값을 지정해야 합니다.

다운 샘플링 동안 이 방법은 많은 픽셀 값을 건너뛰고 원본 이미지에서 몇 개만 선택하기 때문에 비효율적입니다. 여러 픽셀 값을 결합하여 새로운 값을 추정하는 보다 효과적인 방법이 아래에 설명되어 있습니다.

Python에서 block_reduce() 함수를 사용하여 배열 다운샘플링

슬라이싱 및 확대/축소 방법 모두 입력 이미지를 다운샘플링할 때에도 전체 이미지를 흐리게 만드는 계단 효과로 이어집니다.

중간 값을 처리하는 더 나은 방법은 주변 픽셀을 사용하여 값을 추정하는 것입니다. 이는 보간 및 단순 평균과 같은 다양한 방법으로 수행할 수 있습니다.

단순화를 위해 단순 수단 방법을 사용합니다. Python의 skimage.measure 모듈 내부에 있는 block_reduce() 함수는 다차원 배열의 크기를 줄이는 데 사용됩니다.

block_reduce() 함수는 3개의 주요 매개변수를 사용합니다. 원래 배열, 블록 크기 및 각 블록에 적용할 함수.

블록 크기는 축소된 이미지에서 단 하나의 값을 형성하기 위해 원본 이미지의 값이 몇 개나 결합되는지 알려주고 func 매개변수는 모든 값을 하나의 블록으로 결합하는 데 적용될 기능을 지정합니다.

이전의 모든 예에서 (10, 10) 이미지를 (5, 5) 이미지로 축소했기 때문에 블록 크기는 (2, 2)가 되고 새 값을 평균으로 원하므로 블록에서 하나의 값 대신 전체 블록의 np.meanfunc로 사용합니다.

다음 코드 예제는 block_reduce() 메서드를 사용하여 이미지를 다운 샘플링하는 방법을 보여줍니다.

import numpy as np
from skimage.measure import block_reduce

b = np.arange(0, 100)
c = b.reshape([10, 10])

new_c = block_reduce(c, block_size=(2, 2), func=np.mean)
print("Original Array:")
print(c)
print("Downsized Array:")
print(new_c)

출력:

Original Array:
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
Downsized Array:
[[ 5.5  7.5  9.5 11.5 13.5]
 [25.5 27.5 29.5 31.5 33.5]
 [45.5 47.5 49.5 51.5 53.5]
 [65.5 67.5 69.5 71.5 73.5]
 [85.5 87.5 89.5 91.5 93.5]]

위 섹션에 작성된 코드는 원본 이미지 c에서 (2, 2) 블록을 가져와 블록 내부의 모든 4개 값의 평균을 취한 다음 결과를 새 이미지 new_c에 배치합니다.

이 접근 방식은 원본 이미지 블록에서 1개의 값을 취하고 각 블록의 나머지 3개 값을 건너뛰는 대신 모든 값의 결합된 효과를 취하기 때문에 위에서 설명한 이전 두 가지 접근 방식보다 낫습니다.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

관련 문장 - Python Array