read - python opencv write image
invertir la imagen en Python con OpenCV (2)
Quiero cargar una imagen en color, convertirla a escala de grises y luego invertir los datos en el archivo.
Lo que necesito: iterar sobre la matriz en OpenCV y cambiar cada valor individual con esta fórmula (podría estar mal, pero me parece razonable):
img[x,y] = abs(img[x,y] - 255)
pero no entiendo por qué no funciona:
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")
No quiero hacer un ciclo explícito (estoy tratando de ser más pitónico). Puedo ver que en una imagen que obtuvo un fondo blanco se volvió negra, pero solo que esto no parece que los otros colores tengan mucho (si alguno) cambio.
Alternativamente, puede invertir la imagen usando la función bitwise_not
de OpenCV:
imagem = cv2.bitwise_not(imagem)
Me gustó el ejemplo en: https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/
Casi lo haces. Fuiste engañado por el hecho de que abs(imagem-255)
dará un resultado incorrecto ya que tu dtype
es un entero sin signo. Tienes que hacer (255-imagem)
para mantener los enteros sin signo:
def inverte(imagem, name):
imagem = (255-imagem)
cv2.imwrite(name, imagem)
Como recomiendan algunos comentarios aquí, puede invertir la imagen usando la función bitwise_not de OpenCV:
imagem = cv2.bitwise_not(imagem)