np.percentile은 값 중에서 특정 백분위수에 해당하는 값을 구해줍니다.
백분위수란 값을 이뤄진 자료를 순서대로 나열했을 때 백분율로 나타낸 특정 위치의 값을 이르는 용어입니다. 일반적으로 크기가 작은 것부터 나열하여 가장 작은 것을 0, 가장 큰 것을 100으로 합니다. 100개의 값을 가진 어떤 자료의 20 백분위수는 그 자료의 값들 중 20번째로 작은 값을 뜻하며, 50 백분위수는 중앙값과 같습니다.
백분위수이기 때문에 범위는 0~100에 해당합니다.
opencv 같은 모듈로 영상처리를 할 때 percentile을 사용하면 룰베이스 알고리즘을 짤 때 도움이 될 수 있습니다.
아래는 nifti 뇌영상을 로드 후 np.percentile으로 분위수에 해당하는 intensity를 구하는 방법입니다.
cv2로 이미지를 로드하는 과정도 같이 보겠습니다.
# nifti 이미지를 읽기
import nibabel as nib
img = nib.load(r'D:\workspace\FLAIR.nii.gz')
img_data = img.get_fdata()
# 그냥 이미지를 읽기
import cv2
img_data = cv2.imread(r'D:\workspace\img.jpg')
# 백분위 25%의 intensity (밝기값)
>>> np.percentile(img_data, 25)
15.0
# 백분위 50%의 intensity (밝기값)
>>> np.percentile(img_data, 50)
21.0
# 백분위 75%의 intensity (밝기값)
>>> np.percentile(img_data, 75)
207.0
# 백분위 99%의 intensity (밝기값)
>>> np.percentile(img_data, 99)
526.0
배열의 차원에 상관없이 array의 분위수를 구할 수 있습니다.
>>> random = np.random.rand(5)
>>> print(random)
[0.74537579 0.72267249 0.78310735 0.47953445 0.85824387]
# 백분위 50%인 수
>>> np.percentile(random, 50)
0.7453757941000508
# 백분위 10%인 수 (하위 10%)
>>> np.percentile(random, 10)
0.5767896665808552
# 백분위 90%인 수 (상위 10%)
>>> np.percentile(random, 90)
0.8281892623979983
참고자료
https://ko.wikipedia.org/wiki/%EB%B0%B1%EB%B6%84%EC%9C%84%EC%88%98
도움이 되셨다면 아무 광고나 클릭 한 번 부탁드립니다👍