7

カラー画像を白黒画像に変換しようとしています。

元の画像は次のとおりです。

いくつか問題があります。初め:

import pylab as pl
import Image

im = Image.open('joconde.png')

pl.imshow(im)
pl.axis('off')
pl.show()

私はこれを得る:

最初の結果

なぜ回転するのですか?それはポイントではありませんが、理由を知りたいです。

im_gray = im.convert('1')

pl.imshow(im_gray)
pl.show() 

そして、これが処理された白黒画像です。

これですべてが機能しているように見えます。しかし、画像処理を行うには、その画像を numpy 配列として使用する必要があります。私がしなければならないのはこれだけです:

import numpy as np

im_arr = np.array(im_gray)

pl.imshow(im_arr)
pl.axis('off')
pl.show()

しかし、私はこれを取得します:

なぜこうなった?私も試しました:

im_arr = np.array(im_gray, dtype='float')

また:

im_arr = np.asarray(im_gray)

しかし、何も機能していないようです。方法に問題があるのか​​もしれshowませんが、わかりません。

4

2 に答える 2

4

原点の問題により、画像が回転しています。

このスニペットを使用すると、画像は上下逆に回転しません。

pl.imshow(im, origin='lower')
pl.show()

im.show()を使用して画像を表示することもできます。

さて、元の質問に戻ります。問題は、pylab が 2 値画像を処理できないことにあると思います。確かにグレースケール画像を使用したいので、これを行います

import pylab as pl
import matplotlib.cm as cm
import numpy as np
import Image

im = Image.open('your/image/path')
im_grey = im.convert('L') # convert the image to *greyscale*
im_array = np.array(im_grey)
pl.imshow(im_array, cmap=cm.Greys_r)
pl.show() 
于 2012-07-31T11:40:03.670 に答える
2

問題は、画像をnumpy配列に変換する方法にあります。関数からの出力が何であるかを見ると、これは明らかになります

>> np.array(im_gray)
array([[False, False, False, ...,  True, False, False],
   [ True,  True,  True, ...,  True,  True, False],
   [ True,  True,  True, ...,  True,  True, False],
   ..., 
   [False, False, False, ..., False, False, False],
   [False, False, False, ..., False, False, False],
   [False, False, False, ..., False, False, False]], dtype=bool)

それは正しくありません。ブール値の配列ではなく、またはイメージpl.imshowの配列を取ります。したがって、配列への変換をより明示的に行う必要があります。floats uint8PIL

cols,rows = im_gray.size
pixels = list(im_gray.getdata())

# an indexer into the flat list of pixels
# head ranges from 0 to len(pixels) with step cols
# tail ranges from cols to len(pixels) with step cols
head_tail = zip(range(0,len(pixels)+1,cols),range(cols,len(pixels)+1,cols))
im_data = np.ndarray(shape=(cols,rows), dtype=np.uint8)

# extract each row of pixels and save it to the numpy array
for i,(head,tail) in enumerate(head_tail):
    im_data[i] = np.array(pixels[head:tail], dtype=np.uint8)

pl.imshow(im_data, cmap='bone')

最終的pl.imshowには、カラーマップを定義する必要があります。カラーマップは'bone'白黒です。関数に画像を渡すPILと、カラーマップが自動的に定義されると思います。

于 2012-07-31T11:21:44.643 に答える