Showing posts with label marca de agua. Show all posts
Showing posts with label marca de agua. Show all posts

Friday, May 12, 2023

Los claroscuros de la Inteligencia Artificial


Hoy el tema de la Inteligencia artificial (IA) está en boca de todos. Hay un sinfín de tik-toks mostrando diversos sitios web que hacen algo relacionado con el tema. Unos sitios prometen generar avatares en 3D dando solamente la descripción, otros supuestamente muestran mejores sitios que ChatGPT, unos más hacen resúmenes de noticias, etcétera. 

Yo hace tiempo encontré un sitio, http://watermarkremover.io, capaz de quitar la marca de agua de las imágenes. Para quien nunca haya visto estas marcas, son las que tienen los billetes de diversas denominaciones para evitar la falsificación. En el caso de fotografías, se usan para proteger la imagen misma sin que por ello no se pueda ver la propia imagen. Las marcas de agua las usan los sitios de venta de fotografías profesionales. como StockPhoto, Getty Images, etcétera.

Sin embargo, el problema de quitar una marca de agua ha sido atacado por los científicos. Google tiene una investigación al respecto del 2017 De acuerdo con el artículo, se busca entender las vulnerabilidades para proteger de mejor manera los contenidos gráficos digitales.

Yo, en este blog, he escrito un par de artículos al respecto (véase aquí y aquí. En uno de estos artículos hablo de cómo quitar la marca de agua de unas postales que hizo un dibujante en Islandia en 1972, durante el Campeonato Mundial de Ajedrez entre Fischer y Spassky. Dichas postales las vendía alguien pero les había agregado una marca de agua (en un tono rojizo), aunque las caricaturas de esas imágenes eran en tonos de gris. Entonces, quitar la marca de agua parecía sencillo: había que identificar los pixeles con un tono rojo y ver cómo cambiarlos, mientras que los tonos en gris no tenían que siquiera tocarse.

Escribí un programa de computadora para resolver esto, pero desde luego, el mismo no podía quitar ninguna otra marca de agua de ninguna otra foto. Sin embargo, un programa comercial llamado InPaint prometía quitar las marcas de agua si se le indicaba al software dónde se encontraban estas. Las siguientes imágenes quieren mostrarnos cómo quita InPaint automáticamente las partes indeseables, pero la realidad es que en el mundo real falla casi siempre. 




(En la primera imagen aparece una persona a la izquierda de la foto, la cual es indeseable. En la segunda foto se marca a este personaje y en la última foto se ve la imagen sin el problema). Aquí la dificultad es ¿Cómo el software sabe que donde estaba el personaje debe poner ladrillos?

Pero llegaría la IA con su propia solución. El sistema que permite quitar las marcas de agua en línea, watermarkremover, asombra. La razón es que simplemente se le da la imagen a procesar. No se le tiene que indicar en donde está la marca y el software asume -de alguna manera- donde aparece la marca de agua, hace su magia y resuelve. Para la mayoría de las fotos con marca de agua parece funcionar muy bien, pero hay los claroscuros...

Para probar le puse esta foto:

Y este fue el resultado:


Parece genial ¿verdad? Pero está mal. El algoritmo asume que hay marcas de agua que en la imagen son inexistentes y borra algunos rasgos del dibujo ((que no debería borrar). ¿Pueden ver los errores?

Desde luego que esto no invalida lo que hace este programa inteligente. Vamos, siempre habrá excepciones inmanejables y en ese sentido es cada vez más humano, que en muchos casos también maneja excepciones a cada rato. Sólo quería dejar constancia de que incluso la nueva IA tiene sus bemoles.

Thursday, April 06, 2017

Un nuevo reto de la programación lúdica



Dice la Wikipedia que “La marca de agua digital es una técnica esteganográfica de ocultación de información. Su objetivo principal es poner de manifiesto el uso ilícito de cierto servicio digital por parte de un usuario no autorizado. Concretamente, esta técnica consiste en insertar un mensaje (oculto o no) en el interior de un objeto digital (imágenes, audio, vídeo, texto, software), un grupo de bits que contiene información sobre el autor o propietario intelectual del objeto digital tratado (copyright)”.

Comúnmente vemos marcas de agua en algunos billetes, cuyo fin es precisamente evitar la falsificación. En el caso de las imágenes, hay empresas que venden fotografías para usos comerciales como pueden ser portadas de libros, anuncios, etcétera.

En este caso, para que los potenciales clientes puedan ver las fotos (y que no se puedan usar sin consentimiento de la empresa), a las imágenes comerciales se les reduce el tamaño y se les pone una marca de agua, por ejemplo, el logotipo de quien la vende o una imagen que está como fusionada con la imagen original de forma que parece una transparencia.

Así, los interesados pueden ver la foto que les interesa y si deciden de comprarla, entonces la compañía les manda la foto con toda la resolución y sin ninguna marca de agua.

Pues bien, en este enlace platiqué de cómo quitar la marca de agua de una serie de postales que realizó un artista para el encuentro del campeonato mundial de ajedrez de 1972 entre Fischer y Spassky. Alguien en la red vendía dichas postales y probablemente cuando vi esa página web ya las postales en cuestión se habrían vendido. Pero el dueño de las imágenes las puso en un sitio web con una marca de agua para que los interesados pudiesen verlas sin quitarles el atractivo de querer hacerse de ellas físicamente.

El reto de la programación lúdica es tomar las 18 postales originales (que pueden descargarse de este enlace), que tienen todas la marca de agua, y quitárselas mejor que en el algoritmo que yo usé. Por ejemplo, en las siguientes imágenes puede verse el error en el proceso:

 Se sigue viendo un poco la marca de agua (que es un letrero en rojo que dice “PREVIEW”). En los círculos rojos que puse puede discernirse parte de dicha palabra, es decir, no le pude quitar la marca de agua totalmente.


Dar click sobre la imagen para verla más grande

¿Quién lo puede hacer mejor?

El ganador (si es de la Ciudad de México), le daré una taza con el logotipo de la Morsa. Si es de otro país o de provincia, le mandaré un USB de al menos 8 GB.



Cabe señalar que este concurso busca simplemente alentar el trabajo de la programación y mostrar que puede ser lúdica. Es un concurso de buena fe. Si hay, por ejemplo, dos o más respuestas satisfactorias, ganará quien la haya mandado primero. El ganador cede su código fuente a la comunidad. Es decir, se promueve el código abierto.

En este caso no hay restricción en qué lenguaje usar. El concursante tiene que mandar su código fuente, el ejecutable (si aplica), y las 18 fotos procesadas. El concurso tendrá una vigencia de unas tres semanas. Y ahora que viene la Semana Mayor, quizá sea una idea interesante para sentarse a programar. Me tienen que mandar todo a mi correo: morsa@la-morsa.com.

Wednesday, April 27, 2016

El problema de eliminar las marcas de agua


Hay empresas que venden fotografías para ciertos nichos de mercado. Por ejemplo, alguna editoriales buscan fotos profesionales de un tema en particular y si les gusta una para la portada de un libro, simplemente la compran. Pero ¿cómo evitar que la editorial use la foto sin pagarla? Fácil: se le pone una marca de agua, es decir, un logotipo, una leyenda, que está sobre la imagen y que en general permite ver la fotografía pero claro, no puede usarse comercialmente si tiene aparejada la imagen un logotipo o una leyenda sobre quién es el dueño de dicha fotografía.

Este truco permite que las compañías que venden fotografías puedan mostrar su catálogo sin temor a que alguien se lo pirateé. Quitar una marca de agua no es fácil pues en donde esta reside, se tiene una combinación de los pixeles, tanto de la foto como de la leyenda (por ejemplo,  la marca o el nombre del dueño legítimo de esa fotografía). Sí, es posible usar Photoshop e intentar quitar una arca de agua, pero el trabajo es francamente ingrato y no hay garantía de que se pueda hacer rápidamente. Por ejemplo, la siguiente imagen es de este sitio. Puede verse que tiene un buen número de marcas de agua. Es un método no muy invasivo en las fotografías que protege pues, los derechos de autor.

Pero hay veces en que nos gustaría quitar las marcas de agua de forma automática. ¿Podrá haber una manera de hacer esto? He meditado sobre el asunto y creo que no es posible crear un programa general que resuelva el problema. La razón de esto es sencilla: una marca de agua altera la imagen original y se pierden valores en la fotografía, pues se combinan por ejemplo, dos colores, el de la leyenda de la marca de agua y el de la imagen. Así, se pierde la información original de la fotografía.

A pesar de este argumento, hallé un programa llamado inPaint, que promete quitar las marcas de agua y para ello pone esta imagen ejemplo, la de un glaciar. El procedimiento es marcar la zona donde está la marca de agua, presionar el botón "eliminar" y listo, la marca de agua desaparece. Pero... ¿de verdad desaparece? Hice la prueba con el programa gratuito, (que no permite salvar imágenes) y aparentemente quitó la marca de agua de la imagen del glaciar, pero cuando las comparo una con la otra, puede observarse que hizo un "batidero" literalmente en la zona donde procesó la imagen. Y sí, parece que quitó la marca de agua, pero en realidad puso pixeles que de acuerdo a un extraño criterio, el programa cree que deben ponerse ahí.



Si hacemos otra prueba, con otra imagen, hallamos esto:



Puede verse que el programa no hace el trabajo encomendado, a pesar de que hace un buen intento. La culpa desde luego, no es del software, sino de algo más simple: no se puede hacer un programa general para resolver este problema de quitar la marca de agua de forma sencilla, por decir lo menos.

InPaint tiene sin embargo algunas virtudes como editor de fotografías, aunque su punto fuerte, el de quitar imágenes con marca de agua no funciona realmente. Tal vez sus algoritmos pudiesen ser pulidos o bien, esperar a que lleguen las técnicas de las redes neuronales profundas y quizás hasta resuelven este problema.

Tuesday, May 21, 2013

Quitando la marca de agua


Desde hace unos años doy el curso de Procesamiento Digital de Imágenes, en la Facultad de Ciencias (UNAM), y en dicho curso se ven las diferentes técnicas que se usan para transformar imágenes, fotos, etcétera. Uno de los temas es el de la "marca de agua", que en esencia en un mensaje que se pone sobre la foto de manera que esté presente sin ocultar la imagen misma. Esto es como fusionar dos imágenes, una que contiene -por ejemplo- información de los derechos de la foto, o quién es el autor o el propietario de la misma, con la imagen per se. Por ejemplo, la siguiente imagen, de iStockPhoto, muestra la fotografía pero en medio tiene esa marca de agua inquitable. Podemos ver la fotografía y si queremos, podemos comprar la foto (la cual viene ya sin la marca de agua, desde luego).


Las marcas de agua digitales son muy fáciles de hacer y en general se utiliza un algoritmo, denominado como "image blending", el cual puede verse aquí (en Delphi 7):

begin
      //leemos pixel de la imagen 2
      L := Image2.Canvas.Pixels[x,y];
      B2 := ((L shr 16) and $FF);
      G2 := ((L shr 8) and $FF);
      R2 := (L and $FF);
   
      //leemos pixel de la imagen 1
      L := Image1.Canvas.Pixels[Xa,Ya];
      B1 := ((L shr 16) and $FF);
      G1 := ((L shr 8) and $FF);
      R1 := (L and $FF);

      //calculamos pixelblend para la imagen de salida
      blendpixelR := R1 * alpha + R2 * (1.0 - alpha);
      blendpixelG := G1 * alpha + G2 * (1.0 - alpha);
      blendpixelB := B1 * alpha + B2 * (1.0 - alpha);

      //pintamos pixel blended en imagen 3
      BlendPixelRi := trunc(BlendPixelR);
      BlendPixelGi := trunc(BlendPixelG);
      BlendPixelBi := trunc(BlendPixelB);

      Cuantos := RGB(BlendPixelRi,BlendPixelGi,BlendPixelBi);
      if ((B2=0) and (G2=0) and (R2=0))
         then Image3.Canvas.Pixels[xA,yA] := Cuantos //RGB(B1,G1,R1)
         else Image3.Canvas.Pixels[xA,yA] := RGB(R1,G1,B1);
     


Es decir, tomamos un pixel de cada imagen, y ponemos un porcentaje del primero en la imagen resultante y el resto del porcentaje del segundo pixel. Lo que se ve es que las imágenes se superponen como por ejemplo, en esta imagen:



Mediante esta técnica, por ejemplo, las empresas que venden fotos comerciales pueden sentirse seguras de que con la marca de agua evitan que la gente use sus fotografías sin pagar los derechos correspondientes.

Sin embargo, hay otras razones para poner esta marca de agua. Por ejemplo, en 1972, cuando se hizo en Reikjavyk, Islandia, el Campeonato Mundial de Ajedrez, entre Fischer y Spassky, Halldór Petursson (1916-1977), un artista local muy famoso, dibujó dieciocho estupendas caricaturas del denominado Match del Siglo.

Halldór Petursson, firmando un autógrafo


Hoy encuentro que la colección completa de las tarjetas postales de Petursson están a la venta (cuestan unos 250 dólares), y probablemente ya se vendieron, pues el anuncio ya tiene mucho tiempo en esta página.

Sin embargo, quien las vendía puso las imágenes de cada postal con una marca de agua que dice "PREVIEW". Así, se pueden ver las ilustraciones sin temor a que se las "roben" o "pirateen". Evidentemente tener las imágenes originales sería sensacional, pero la verdad es que no estoy dispuesto -si es que aún se venden- a pagar esa cantidad.

Entonces pensé que quizás podría eliminar la marca de agua. Finalmente doy un curso de proceso digital de imágenes y entiendo de estos temas. Con esto en mente me senté a analizar las fotografías de las postales, usando para ello Photoshop.

Hallé que, aunque son en blanco y negro, el escaneo de las imágenes se hizo en color (por ello la palabra PREVIEW se ve en un rojo claro). Si las originales hubiesen sido escaneadas en tonos de grises y de ahí puesta la marca de agua, el proceso de quitar la misma sería fácil, pues cada pixel -en blanco y negro- tendría el mismo valor para el Rojo - (R)ed, Verde - (G)reen y Azul (B)lue, en el dibujo. Hallé pues que cada pixel en tono de gris corresponde a casi el tono de gris, con R casi igual a G y casi igaul a B. Distan por una o dos unidades.

Considerando esto mi plan fue entonces:

  • Leer la imagen original
  • Leer cada pixel y ver si se trata de un pixel en tono de gris, por lo que asumí que la diferencia entre las componentes de color no pasaría de unas 5 unidades
  • Si es un pixel en blanco y negro, lo dejo igual. En caso contrario, lo paso a blanco (R=G=B=255).

Realizo este proceso en toda la imagen.

Hallé que las cosas casi  funcionaron correctamente. Desafortunadamente el blanco en un pixel de color rojo lo quitaba, pero si atrás había un punto oscuro, entonces éste era totalmente eliminado.

Decidí entonces sacar un promedio y probar. En lugar de poner un pixel blanco donde hay uno de color rojo, puse la suma de (R+G+B) / 3 y hallé que esto aclaró la marca de agua, pero no lo suficiente. Entonces le agregué una constante, que es el brillo y entonces el proceso quitó casi "mágicamente", la marca de agua de cada postal.

He aquí un par de ejemplos del proceso (dé click para hacerlas más grandes). Las imágenes completas las puse en el blog de fotos de Bobby Fischer, por quien le interese verlas.





El software -a quien le interese ver qué hice ya en términos de código- puede pedírmelo  a morsa@la-morsa.com y a vuelta de correo lo tendra de forma gratuita. La opción de quitar la marca de agua solamente funciona para las postales de Petursson, pero enseña la idea detrás del proceso.