- 추석입니다.
- 빛나는 보름달을 그립니다.
1. 추석 달
- 보름달 주위로 빛이 살짝 스며나올 때가 있습니다.
- 구름이 옅게 끼거나 공기가 습할 때 일부가 굴절되는 것입니다.
2. 빛이 스미는 보름달
2.1. 보름달
- 빛이 하늘에 번지는 보름달을 그립니다.
- 먼저, 2022 x 2022 크기의 공간을 만들고 한 가운데 반지름이 800인 원을 그립니다.
- 2022 x 2022 numpy array를 만든 후 가운데만 255, 나머지는 0으로 지정합니다.
1
2
3
4
5
6
7
8
9
10moon = np.zeros((2022, 2022), dtype=int)
r = 800
for i in range(2022):
for j in range(2022):
d = np.sqrt(np.power(i-1011, 2) + np.power(j-1011, 2))
if d < r:
moon[i, j] = 255
fig, ax = plt.subplots(figsize=(5, 5), constrained_layout=True)
ax.imshow(moon)
2.2. 빛 번짐
Nicolas P. Rougier, Contour-Dropshadow
scipy: gaussian_filter
빛이 번지는 효과를 구현합니다.
scipy
의gaussian_filter
를 사용합니다.1
2
3
4
5from scipy.ndimage import gaussian_filter
glow = gaussian_filter(moon, 30)
fig, ax = plt.subplots(figsize=(5, 5), constrained_layout=True)
ax.imshow(glow)붉은 달이 떴습니다.
색은
cmap
에 적절한 컬러맵을 입력해 조정합니다.1
2fig, ax = plt.subplots(figsize=(5, 5))
ax.imshow(glow, origin="upper", zorder=0, cmap="viridis")
2.3. 컬러맵 제작
seaborn.color_palette
matplotlib: Creating Colormaps in Matplotlib
검정에 가까운 어두운 색부터 밝은 노랑을 거쳐 흰색으로 이어지는 컬러맵이 필요합니다.
이런 컬러맵이 없으니 새로 만듭니다.
매우 어두운 노랑 ~ 조금 어두운 노랑(
y
)까지 이어지는 팔레트를 먼저 만들고,1
2cmap0 = sns.color_palette("dark:y", 20)
cmap0조금 어두운 노랑(
y
)에서 흰색으로 이어지는 팔레트를 새로 만듭니다.seaborn의
color_palette()
를 사용합니다.1
2cmap1 = sns.color_palette("blend:y,w", 20)
cmap1이 두 팔레트를 합쳐 Matplotlib colormap으로 출력합니다.
1
2
3
4from matplotlib.colors import ListedColormap
cmap = ListedColormap(cmap0 + cmap1)
cmap이렇게 만든 컬러맵을 번진 달빛에 적용합니다.
1
2fig, ax = plt.subplots(figsize=(5, 5))
ax.imshow(glow, origin="upper", zorder=0, cmap=cmap)
2.4. 보름달 + 빛 번짐
보름달 사진을 보면, 웬만큼 구름이 끼지 않고서야 달의 동그란 경계가 선명합니다.
빛 번짐 그림은 경계가 흐릿합니다.
여기 달 그림을 반투명하게 씌워 선명한 경계를 구현합니다.
달 그림 중에서 배경에 해당하는 부분은
numpy masked_array
를 사용해 그리지 않습니다.1
2
3
4fig, ax = plt.subplots(figsize=(5, 5))
ax.imshow(glow, origin="upper", zorder=0, cmap=cmap)
ax.imshow(np.ma.masked_array(moon, moon <1), origin="upper", zorder=0,
vmin=0, vmax=255, cmap=cmap, alpha=0.5)달의 경계가 살아났습니다
마지막으로, x 축과 y 축을 없애고 그림만 남깁니다.
1
2
3
4
5fig.set_size_inches((10, 10))
ax.axis(False)
fig.set_facecolor(cmap0[0])
fig.tight_layout()
display(fig)모두 즐거운 한가위 되시기 바랍니다.