它看起來像有一些錯誤與轉換到/從numpy的與1
模式。
如果你將其轉換爲L
第一,它工作正常:
>>> im
<BmpImagePlugin.BmpImageFile image mode=1 size=2x2 at 0x17F17E8>
>>> im2 = im.convert('L')
>>> numpy.asarray(im2)
array([[ 0, 255],
[255, 0]], dtype=uint8)
另外,如果你嘗試轉換bool
numpy的陣列到PIL,你得到奇怪的結果:
>>> testarr = numpy.array([[True,False],[True,False]], dtype=numpy.bool)
>>> testpil = Image.fromarray(testarr, mode='1')
>>> numpy.asarray(testpil)
array([[False, False],
[False, False]], dtype=bool)
然而與uint8
完全一樣的事情正常工作:
>>> testarr = numpy.array([[255,0],[0,255]], dtype=numpy.uint8)
>>> Image.fromarray(testarr)
<Image.Image image mode=L size=2x2 at 0x1B51320>
>>> numpy.asarray(Image.fromarray(testarr))
array([[255, 0],
[ 0, 255]], dtype=uint8)
所以我建議使用L
作爲中間數據類型,然後在保存前轉換爲1
,如果您需要將其保存爲該格式。事情是這樣的:
>>> im
<BmpImagePlugin.BmpImageFile image mode=1 size=2x2 at 0x17F17E8>
>>> im2 = im.convert('L')
>>> arr = numpy.asarray(im2)
>>> arr
array([[ 0, 255],
[255, 0]], dtype=uint8)
>>> arr = arr == 255
>>> arr
array([[False, True],
[ True, False]], dtype=bool)
然後轉換回:
>>> backarr = numpy.zeros(arr.shape, dtype=numpy.uint8)
>>> backarr[arr] = 255
>>> backarr
array([[ 0, 255],
[255, 0]], dtype=uint8)
>>> Image.fromarray(backarr).convert('1')
<Image.Image image mode=1 size=2x2 at 0x1B41CB0>
你可以張貼位圖? – jterrace
http://njuer.us/clippit/test.bmp,由GIMP製作 – Clippit