2013-10-25 20 views
21

カラーイメージを読み込んでグレースケールに変換し、ファイル内のデータを反転したいとします。OpenCVを使ってPythonでイメージを反転する

私は必要なもの:OpenCVの中に配列を反復し、この式で、すべて単一の値を変更するには(それは間違っているかもしれないが、それは私のために合理的なようだ):

img[x,y] = abs(img[x,y] - 255) 

が、私はその理由を理解していませんそれは動作しません:

def inverte(imagem, name): 
    imagem = abs(imagem - 255) 
    cv2.imwrite(name, imagem) 


def inverte2(imagem, name): 
    for x in np.nditer(imagem, op_flags=['readwrite']): 
     x = abs(x - 255) 
    cv2.imwrite(name, imagem) 


if __name__ == '__main__': 
    nome = str(sys.argv[1]) 
    image = cv2.imread(nome) 
    gs_imagem = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
    inverte(gs_imagem, "invertida.png") 
    inverte2(gs_imagem, "invertida2.png") 

私は(私はもっとpythonicしようとしています)明示的なループをしたくありません。白い背景がある画像では黒くなっているのがわかりますが、他の色には(もしあれば)多くの変化があるように見えません。

答えて

42

あなたはほとんどそれをしました。 dtypeが符号なし整数であるため、abs(imagem-255)が間違った結果を出すという事実によって、あなたは騙されました。あなたは、符号なし整数を維持するために(255-imagem)を実行する必要があります。

def inverte(imagem, name): 
    imagem = (255-imagem) 
    cv2.imwrite(name, imagem) 

ここにいくつかのコメントで推奨されているように、あなたがOpenCVののbitwise_not機能を使って画像を反転できます。

また
imagem = cv2.bitwise_not(imagem) 
+2

ありがとう! 私はPythonで標準がunsigned intであることを知りませんでした... – Mansueli

+3

きちんとした、これは簡単だとは思わなかった、ありがとう。 – Nit

+2

本当にする必要がある場合を除き、ホイールを再発明しないでください。データを反転するには、[Not](http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#bitwise-not)(別名 'bitwise_not')を使用してください。 – vaxquis

関連する問題