web-dev-qa-db-ja.com

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

48
Mansueli

あなたはほとんどやった。 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)
95

または、OpenCVのbitwise_not関数を使用して画像を反転できます。

imagem = cv2.bitwise_not(imagem)

次の例が気に入った: https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/

38
Eric Olmon

あなたはそれを行うために「チルダ」演算子を使用することができます:

import cv2
image = cv2.imread("img.png")
image = ~image
cv2.imwrite("img_inv.png",image)

これは、「チルダ」演算子(単項演算子とも呼ばれる)が、オブジェクトのタイプに応じて補数を実行するためです。

たとえば整数の場合、その式は次のとおりです。

x +(〜x)= -1

ただし、この場合、opencvはイメージに「uint8 numpy array object」を使用するため、範囲は0〜255です。

したがって、次のようにこの演算子を「uint8 numpy array object」に適用すると、

import numpy as np
x1 = np.array([25,255,10], np.uint8) #for example
x2 = ~x1
print (x2)

結果として:

[230 0 245]

その式は次のとおりです。

x2 = 256-x1

それがまさに問題を解決するために私たちがしたいことです。

12
Diroallu