アンチエイリアスのために、グレーの色がいくつか存在することがあります。
matplotlibによって実行されるアンチエイリアスと、イメージビューア(ブラウザなど)に存在するアンチエイリアスを区別する必要があります。
matplotlibに関しては、antialiased = False
を設定してアンチエイリアスをオフにするオプションがあります。ほとんどのアーティストやコレクションにはこのオプションがあります。したがって、この場合
PatchCollection(...,antialiased=False)
トリックを行います。
この違いを確認するには、次のスクリプトを検討してください。 antialiased
〜True
(既定値)を設定すると、画像に121の異なるグレーの色合いが出力され、False
に設定すると2(白黒)になります。
antialiased=True
:
antialiased=False
:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
from matplotlib.collections import PatchCollection
antialiased=False
N = 3
x = [1,2];y=[1,1]
radii = [0.5,.4]
patches = []
for x1, y1, r in zip(x, y, radii):
patches.append(Circle((x1, y1), r))
coll_intra = PatchCollection(patches, facecolors='black', edgecolors='black',antialiased=antialiased)
fig, ax = plt.subplots(figsize=(2,1))
ax.set_aspect("equal")
ax.axis("off")
ax.set_xlim([0,3])
ax.set_ylim([0,2])
ax.add_collection(coll_intra)
#count the number of different colors
#https://stackoverflow.com/questions/7821518/matplotlib-save-plot-to-numpy-array
#https://stackoverflow.com/questions/40433211/how-can-i-get-the-pixel-colors-in-matplotlib
fig.canvas.draw()
data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
data = data.reshape((int(len(data)/3), 3))
data = np.vstack({tuple(row) for row in data})
print len(data) # prints 121 for antialiased=True
# 2 for antialiased=False
plt.show()
(。色をカウントする方法がthisとthis質問から構成されている)
たぶん私は欠けている何かが、私あなたのイメージには灰色のリングは見えません。ライブプロットや保存された画像で生成されるこれらの「アーティファクト」もありますか?これは、イメージを "変更"するときのスムーズさの操作(rescale、convertなど)の効果によく似ています。また、あなたの画面が何らかの種類の特別なフィルターを使用していないかどうかを確認してください(私は実際には灰色のリングが見えないので、これをすべて言っています。 – armatita