이미지 안티앨리어싱 #

이미지는 화면이나 이미지 파일에서 개별 픽셀로 표시됩니다. 이미지를 구성하는 데이터의 해상도가 화면의 표현과 다른 경우 앨리어싱 효과가 나타납니다. 이것이 눈에 띄는 정도는 해상도 변경(있는 경우)에서 얼마나 많은 다운 샘플링이 발생하는지에 따라 다릅니다.

데이터를 서브샘플링할 때 먼저 스무딩한 다음 스무딩된 데이터를 서브샘플링하여 앨리어싱을 줄입니다. Matplotlib에서는 데이터를 색상에 매핑하기 전에 스무딩을 수행하거나 최종 이미지의 RGB(A) 데이터에 대해 스무딩을 수행할 수 있습니다. 이들 간의 차이점은 아래에 나와 있으며 interpolation_stage 키워드 인수로 제어됩니다.

Matplotlib의 기본 이미지 보간은 'antialiased'이며 데이터에 적용됩니다. 이것은 대부분의 상황에서 앨리어싱을 줄이기 위해 사용자가 제공한 데이터에 해닝 보간법을 사용합니다. 업샘플링이 1, 2 또는 >=3인 경우에만 '가장 가까운' 이웃 보간이 사용됩니다.

보간 키워드 인수 를 Axes.imshow사용하여 다른 앤티앨리어싱 필터를 지정할 수 있습니다 .

import numpy as np
import matplotlib.pyplot as plt

먼저 다양한 주파수 콘텐츠로 450x450 픽셀 이미지를 생성합니다.

N = 450
x = np.arange(N) / N - 0.5
y = np.arange(N) / N - 0.5
aa = np.ones((N, N))
aa[::2, :] = -1

X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)
f0 = 5
k = 100
a = np.sin(np.pi * 2 * (f0 * R + k * R**2 / 2))
# make the left hand side of this
a[:int(N / 2), :][R[:int(N / 2), :] < 0.4] = -1
a[:int(N / 2), :][R[:int(N / 2), :] < 0.3] = 1
aa[:, int(N / 3):] = a[:, int(N / 3):]
a = aa

다음 이미지는 450 데이터 픽셀에서 125픽셀 또는 250픽셀(디스플레이에 따라 다름)로 서브샘플링됩니다. '가장 가까운' 보간의 무아레 패턴은 서브샘플링되는 고주파수 데이터로 인해 발생합니다. 이미지의 '앤티앨리어싱'에는 여전히 약간의 무아레 패턴이 있지만 크게 줄었습니다.

'데이터' 보간과 'rgba' 보간 사이에는 상당한 차이가 있습니다. 이미지의 왼쪽 1/3에서 빨간색과 파란색이 번갈아 나타나는 밴드가 서브샘플링됩니다. '데이터' 공간(기본값)에서 보간함으로써 안티앨리어싱 필터는 스트라이프를 흰색에 가깝게 만듭니다. 왜냐하면 -1과 +1의 평균은 0이고 0은 이 컬러맵에서 흰색이기 때문입니다.

반대로 'rgba' 공간에서 앤티 앨리어싱이 발생하면 빨간색과 파란색이 시각적으로 결합되어 보라색이 됩니다. 이 동작은 일반적인 이미지 처리 패키지와 비슷하지만 보라색은 원본 컬러맵에 없으므로 더 이상 개별 픽셀을 데이터 값으로 반전할 수 없습니다.

fig, axs = plt.subplots(2, 2, figsize=(5, 6), constrained_layout=True)
axs[0, 0].imshow(a, interpolation='nearest', cmap='RdBu_r')
axs[0, 0].set_xlim(100, 200)
axs[0, 0].set_ylim(275, 175)
axs[0, 0].set_title('Zoom')

for ax, interp, space in zip(axs.flat[1:],
                             ['nearest', 'antialiased', 'antialiased'],
                             ['data', 'data', 'rgba']):
    ax.imshow(a, interpolation=interp, interpolation_stage=space,
              cmap='RdBu_r')
    ax.set_title(f"interpolation='{interp}'\nspace='{space}'")
plt.show()
줌, interpolation='가장 가까운' 공간='data', interpolation='antialiased' space='data', interpolation='antialiased' space='rgba'

업샘플링 계수가 정수가 아닌 경우 '가장 가까운' 보간법으로 이미지를 업샘플링해도 무아레 패턴이 나타납니다. 다음 이미지는 500 데이터 픽셀을 530 렌더링 픽셀로 업샘플링합니다. 구성해야 하는 524 - 500 = 24개의 추가 픽셀에서 비롯된 30개의 선과 같은 아티팩트의 그리드를 확인할 수 있습니다. 보간은 '가장 가깝기' 때문에 인접한 픽셀 라인과 동일하므로 이미지가 왜곡되어 보이도록 로컬로 늘어납니다.

fig, ax = plt.subplots(figsize=(6.8, 6.8))
ax.imshow(a, interpolation='nearest', cmap='gray')
ax.set_title("upsampled by factor a 1.048, interpolation='nearest'")
plt.show()
계수 a 1.048로 업샘플링, 보간='가장 가까운'

더 나은 앤티앨리어싱 알고리즘을 사용하면 이 효과를 줄일 수 있습니다.

fig, ax = plt.subplots(figsize=(6.8, 6.8))
ax.imshow(a, interpolation='antialiased', cmap='gray')
ax.set_title("upsampled by factor a 1.048, interpolation='antialiased'")
plt.show()
계수 a 1.048로 업샘플링, 보간='안티앨리어싱'

기본 '해닝' 앤티앨리어싱 외에도 imshow다양한 보간 알고리즘을 지원하며 패턴에 따라 더 좋거나 더 나쁠 수 있습니다.

fig, axs = plt.subplots(1, 2, figsize=(7, 4), constrained_layout=True)
for ax, interp in zip(axs, ['hanning', 'lanczos']):
    ax.imshow(a, interpolation=interp, cmap='gray')
    ax.set_title(f"interpolation='{interp}'")
plt.show()
보간='해닝', 보간='lanczos'

참조

다음 함수, 메서드, 클래스 및 모듈의 사용이 이 예제에 표시됩니다.

스크립트의 총 실행 시간: (0분 3.316초)

Sphinx-Gallery에서 생성한 갤러리