カラー画像を読み込んでグレースケールに変換し、ファイル内のデータを反転させたい。
必要なもの: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つの画像で黒に変わったことがわかりますが、これだけでは、他の色が(もしあれば)大きく変化しているようには見えません。
あなたはほとんどやった。 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)
または、OpenCVのbitwise_not
関数を使用して画像を反転できます。
imagem = cv2.bitwise_not(imagem)
次の例が気に入った: https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/
あなたはそれを行うために「チルダ」演算子を使用することができます:
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
それがまさに問題を解決するために私たちがしたいことです。