1. ホーム
  2. python

[解決済み] PythonでOpenCVを使った画像の反転処理

2023-04-16 02:14:59

質問

カラー画像を読み込み、グレースケールに変換した後、ファイル内のデータを反転させたいのですが。

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

どのように解決するのですか?

もう少しで成功するところでしたね。という事実にだまされたのですね。 abs(imagem-255) は間違った結果をもたらします。 dtype は符号なし整数だからです。そのため (255-imagem) を使うことで、整数を符号なしにしています。

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

また、画像を反転させるには bitwise_not という関数を使って画像を反転させることもできます.

imagem = cv2.bitwise_not(imagem)