Jump to content


Photo

Pasar imagen a Blanco y negro o escala de grises


  • Please log in to reply
5 replies to this topic

#1 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 260 posts

Posted 12 November 2014 - 05:22 PM

Buenas amigos aquí yo de tiempo  :) disculpe la molestía quería hacerles una pequeña consulta, mas o menos si me pueden dar una idea de como convertir una imagen de color a blanco y negro.

por ahí encontré este código:



delphi
  1. TJPEGImage(Image1.Picture.Graphic).GrayScale := True;



Pero no funciona en lazarus salé error...

Saludos.
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 12 November 2014 - 06:25 PM

Creo recordar que con TBGRABitmap puedes hacer eso de forma directa. Recomiendo que sigas su tutorial para familizarte con él.

De todas formas, si no lo tiene, una forma de generar una imagen en blanco y negro consiste en inspeccionar cada pixel y compararlo con un valor de umbral que uno pueda configurar. Si el valor del pixel es menor a el se pinta de negro/blanco y si es mayor o igual de blanco/negro.

Para generar escala de grises, hay dos métodos: por brillo o por contraste. Por contraste (si es que no recuerdo mal) lo que se hace es simplemente tomar el valor de rojo, verde y azul de cada pixel y calcular el promedio. Luego se reemplaza el valor RGB por éste. Es decir, pintamos en cada canal con el valor promediado.
La otra técnica se basa en una ponderación, asignandole a cada canal un peso prefijado a cada uno. Es decir Rojo = Rojo x peso_rojo, y así por cada uno. No recuero exactamente los pesos.

Saludos,
  • 0

#3 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 posts
  • LocationMisiones, Argentina

Posted 13 November 2014 - 01:08 PM

TBitmap.ScanLine permite acceder a cada uno de los píxeles de la imagen.
Se puede convertir una imagen teniendo en cuenta que cada pixel tiene tres valores: Red, Green, Blue. Cada valor puede ser un número entre 0 y 255. Para que una imagen tome el tono gris, será necesario igualar estos tres componentes, por ej: R=120, G=120 y B=120.

Como bien dijo Delphius puedes promediar los valores y asignar a cada componente del registro RGB el mismo valor, eso dará como resultado una imagen en escalas de grises.
Ahora, si lo que necesitas es blanco y negro, la cosa es diferente, pues hay que ver que este promedio pase del valor del medio o no, es decir 127, si pasa de 127 será 255 y en caso contrario será 0, siempre para los tres componentes: R, G y B de la estructura TRGB. En Photoshop existe un filtro llamado umbral que hace este trabajo teniendo en cuenta el valor medio para tal desición.

Saludos

  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 13 November 2014 - 01:38 PM

El tema me recuerda a cuando usé los valores de luminancia de una imagen para representar en escala de grises los valores de profundidad de la misma y generar estereogramas

Saludos.
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 13 November 2014 - 02:20 PM

En Lazarus las cosas son un poco diferentes ya que está pensando para ofrecer tratamiento gráfico independiente del sistema operativo. La Clase TBGRABitmap es una clase bastante potente. El acceso a los pixeles tiene su parecido al de Delphi, pero también sus diferencias.
Por empezar, este componente trabaja con RGBA. Es decir, que tiene el 4to canal Alpha para manejar transparencias. Estoy viendo que cuenta con un procedimiento AlphaToGrayscale pero no he probado su uso.

En este otro tutorial, hay más info de como interpretar el acceso a pixeles.

Y entre los tutoriales no he visto ejemplo de pasar a blanco y negro o a escala de grises.

Saludos,
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 13 November 2014 - 02:40 PM

Ha, ya he visto como puede hacerse de forma directa sin tener que estar manipulando pixeles. Existe un filtro, Filtergrayscale. Esto regresa un TBGRACustomBitmap con la imagen convertida. Luego puede pintarse este en el form por ejemplo. Algo así:




delphi
  1. var ImagenOriginal: TBGRABitmap;
  2.       ImagenGris: TBRGACustomBitmap;
  3. begin
  4. imagenOriginal := TBGRABitmap.Create('Foto.jpg');
  5. ImagenGris := ImageOriginal.FilterGrayscale;
  6. ImagenGris.Draw(0,0, true);



Seguramente hay otro filtro para manipular la imagen en blanco y negro.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.