89

カラー画像を読み込み、グレースケールに変換してから、ファイル内のデータを反転したいと考えています。

必要なもの: 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 になろうとしています)。白い背景の 1 つの画像が黒くなっていることがわかりますが、これだけでは、他の色が (もしあれば) 大きく変化しているようには見えません。

4

4 に答える 4

184

あなたはほとんどそれをしました。あなたは符号なし整数であるabs(imagem-255)ため、間違った結果をもたらすという事実にだまされました。整数を符号なしに保つためには、次のことdtypeを行う必要があります。(255-imagem)

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

bitwise_notOpenCV の関数を使用して画像を反転することもできます。

imagem = cv2.bitwise_not(imagem)
于 2013-10-31T16:35:50.043 に答える