2017-02-27 5 views
1

Python v2.7でmatplotlib(バージョンは不明)を使用して、OOF2解析で使用するための円を含むイメージを生成しています。円は、すべて同じRGB値(#000000)で構成されたピクセルを持つ必要がありますが、円が生成されると、エッジの周りに「灰色」のリングがあります。 coll_intra = matplotlib.collections.PatchCollection(circle_intra, facecolors='black', edgecolors='black')円のエッジに沿って色のグラデーションを生成する円のmatplotlibはなぜですか?

「黒」と「なし」の間のエッジカラーを変更すると効果はありますが、値が完全に等しくなるようには設定されません。彼らの周りの「グレー」のリングで
円:
Circles with rings of "grey" around them.

私のスクリプトでこれを調整する方法はありますか、私は力ずくする必要があります、それを別のプログラムに? (例えば、MSPaint)。

+0

たぶん私は欠けている何かが、私あなたのイメージには灰色のリングは見えません。ライブプロットや保存された画像で生成されるこれらの「アーティファクト」もありますか?これは、イメージを "変更"するときのスムーズさの操作(rescale、convertなど)の効果によく似ています。また、あなたの画面が何らかの種類の特別なフィルターを使用していないかどうかを確認してください(私は実際には灰色のリングが見えないので、これをすべて言っています。 – armatita

答えて

0

アンチエイリアスのために、グレーの色がいくつか存在することがあります。
matplotlibによって実行されるアンチエイリアスと、イメージビューア(ブラウザなど)に存在するアンチエイリアスを区別する必要があります。

matplotlibに関しては、antialiased = Falseを設定してアンチエイリアスをオフにするオプションがあります。ほとんどのアーティストやコレクションにはこのオプションがあります。したがって、この場合

PatchCollection(...,antialiased=False) 

トリックを行います。

この違いを確認するには、次のスクリプトを検討してください。 antialiasedTrue(既定値)を設定すると、画像に121の異なるグレーの色合いが出力され、Falseに設定すると2(白黒)になります。

antialiased=True
enter image description here
antialiased=False
enter image description here

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() 

(。色をカウントする方法がthisthis質問から構成されている)

+0

ありがとう、これは私の問題を正確に解決しました。 – PBH

+0

それを聞いてよかったです。これがあなたの質問に答えるならば、[受諾](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を考慮してそれをアップヴォートするか、そうでなければ自由に質問を洗練してください。 – ImportanceOfBeingErnest

関連する問題