공학자를 위한 Python 사용법 19
2015_1_21(15h 2m 0s){0:04d}.tif'.format(idx) 선충의 이미지를 해석하는 아래 프로그램을 설명하도록 하겠습니다.
https://gist.github.com/myjr52/64b8b80da1e2b4efedde
우리가 그 동안 자주 사용했던 numpy와 matplotlib말고, 다음 두가지 함수 모음집을 이 프로그램에서 사용합니다.
from skimage.segmentation import boundaries from scipy import ndimage
특히 skimage는 여러가지 매우 유용한 그림 처리 함수가 구현되어있습니다. 자세한 설명은 아래에 가면 볼 수 있습니다.
http://scikit-image.org/
일단 네개의 그림 파일 이름이
2015_1_21(15h 2m 0s)0001.tif
2015_1_21(15h 2m 0s)0002.tif
2015_1_21(15h 2m 0s)0003.tif
...
형식으로 되어있습니다. 이 그림을 한장씩 for-loop에서 읽기 위해 다음과 같이 파일 이름을 생성합니다.
file_name = '2015_1_21(15h 2m 0s){0:04d}.tif'.format(idx)
여기서 맨 오른쪽끝에 있는 idx가 1부터 증가하는데 {0:04d}부분이 이 숫자로 대체됩니다. 한개의 입력밖에 없으므로 {0: ...}에서 0이 첫번째 입력 idx를 의미하고 {0:04d}에서 04d는 index 정수 취급을 하는데(d가 정수 취급하라는 뜻입니다), 4자리에 출력하고 빈자리는 0으로 채우라는 (04부분) 뜻입니다.
matplotlib에 imread (image read의 줄임말?)라는 함수에 위의 함수 이름을 대입해서 해당 그림을 읽습니다.
Worm_Image = plt.imread(file_name)
이렇게 읽은 Worm_Image는 3차원 배열인데, [:,:,0], [:,:,1], [:,:,2]가 각각 빨간색, 파란색, 녹색의 정도에 대한 정보를 담고 있는 배열입니다. 즉, 읽은 원래의 그림은 색깔이 보통 있는데, 여기서 이 배열을 흑백그림으로 바꾸기 위해 이 세개의 배열을 다음과 같이 가중치를 두어서 2차원 배열로 만듭니다.
Worm_Image = (0.2989*Worm_Image[:,:,0]/max_val_img + 0.5870*Worm_Image[:,:,1]/max_val_img + 0.1140*Worm_Image[:,:,2]/max_val_img)
여기서 mag_val_imag는 원래 그림 배열이 갖고 있는 최대값입니다. 이 최대값으로 원래 그림배열을 나눠서 0과 1사이값으로 만들고, 그 앞에 가중치를 각각 0.2989, 0.5870, 0.1140으로 두어서 더했습니다. 이 가중치는 언듯보아서는 특별한 의미가 없어보이는데요. 색깔있는 그림을 흑백으로 바꿀때 사용되는 표준적인 가중치입니다. 어떻게 이 값이 정해졌는지는 아마도 그림처리 이론에서 알듯합니다.
여기서 이 그림처리의 큰 목적은 선충 몸의 경계선을 찾아내는것인데, 다음과 같이 간단히 find_boundaries라는 함수를 쓰면 됩니다.
Worm_Image = boundaries.find_boundaries(Worm_Image)
그런 다음 큰 폐곡선 안에 작은 폐곡선이 있을 수 있는데 이런 작은 폐곡선을 scipy에 있는 다음 함수로 모두 없애버립니다.
Worm_Image = ndimage.binary_fill_holes(Worm_Image)
그런 다음 한번 더 경계선을 찾는 함수를 적용하면, 주어진 그림의 경우 거의 완벽하게 선충의 경계선을 찾아냅니다.
















