glowing full moon

  • 추석입니다.
  • 빛나는 보름달을 그립니다.

1. 추석 달

오마이뉴스: 이번 추석, ‘초 슈퍼문’ 볼 수 있다 (2015.09.22.)

  • 보름달 주위로 빛이 살짝 스며나올 때가 있습니다.
  • 구름이 옅게 끼거나 공기가 습할 때 일부가 굴절되는 것입니다.


2. 빛이 스미는 보름달

2.1. 보름달

  • 빛이 하늘에 번지는 보름달을 그립니다.
  • 먼저, 2022 x 2022 크기의 공간을 만들고 한 가운데 반지름이 800인 원을 그립니다.
  • 2022 x 2022 numpy array를 만든 후 가운데만 255, 나머지는 0으로 지정합니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    moon = 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

  • 빛이 번지는 효과를 구현합니다.

  • scipygaussian_filter를 사용합니다.

    1
    2
    3
    4
    5
    from 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
    2
    fig, 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
    2
    cmap0 = sns.color_palette("dark:y", 20)
    cmap0


  • 조금 어두운 노랑(y)에서 흰색으로 이어지는 팔레트를 새로 만듭니다.

  • seaborn의 color_palette()를 사용합니다.

    1
    2
    cmap1 = sns.color_palette("blend:y,w", 20)
    cmap1


  • 이 두 팔레트를 합쳐 Matplotlib colormap으로 출력합니다.

    1
    2
    3
    4
    from matplotlib.colors import ListedColormap

    cmap = ListedColormap(cmap0 + cmap1)
    cmap


  • 이렇게 만든 컬러맵을 번진 달빛에 적용합니다.

    1
    2
    fig, ax = plt.subplots(figsize=(5, 5))
    ax.imshow(glow, origin="upper", zorder=0, cmap=cmap)


2.4. 보름달 + 빛 번짐

Numpy: ma module

  • 보름달 사진을 보면, 웬만큼 구름이 끼지 않고서야 달의 동그란 경계가 선명합니다.

  • 빛 번짐 그림은 경계가 흐릿합니다.

  • 여기 달 그림을 반투명하게 씌워 선명한 경계를 구현합니다.

  • 달 그림 중에서 배경에 해당하는 부분은 numpy masked_array를 사용해 그리지 않습니다.

    1
    2
    3
    4
    fig, 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
    5
    fig.set_size_inches((10, 10))
    ax.axis(False)
    fig.set_facecolor(cmap0[0])
    fig.tight_layout()
    display(fig)


  • 모두 즐거운 한가위 되시기 바랍니다.


도움이 되셨나요? 카페인을 투입하시면 다음 포스팅으로 변환됩니다

Share