Ir al contenido


Foto

Evaluando un RGB si NO es gris

if condición lógica

  • Por favor identifícate para responder
7 respuestas en este tema

#1 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 10 junio 2015 - 05:10

Pues eso amigos. Pregunta fácil, directa y rápida. Tengo la cabeza en otro mundo (hoy fue un día perdido prácticamente)... ¿Cuál sería la evaluación/condición que pondrían ustedes?

 

Actualmente tengo esto:


delphi
  1. if (Blue <> Green) OR (Blue <> Red)
  2.  
  3. then Grey := false;

Se que se puede hacer de forma directa:


delphi
  1. Grey := NOT ((Blue <> Green) OR (Blue <> Red));

Pero a mi me interesa solamente recuperar en la variable Grey cuando se detecta que NO LO SEA, como esta instrucción está dentro de un ciclo es posible que al leer los siguientes valores, el valor se "pise" este resultado. La idea es que esta variable sea una especie de flag o de variable de resultado.

 

Si... se también que el nombre del flag no es el más adecuado...

 

Mi pregunta es ¿Estas comparaciones son suficientes? Mi cabeza ahora se le dió por pedirme que evalúe entre Green y Red también. Las clases de lógica me fallan :p

 

Saludos,


  • 0

#2 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 10 junio 2015 - 06:13

Pero no usas los 3 valores del RGB?

RGB(128,128,128) = Gris oscuro

RGB(192,192,192) = Gris claro

 

Y hay metodos para obtener el color de un pixel.. no se si esto te sirve..


  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 10 junio 2015 - 07:29

Pero no usas los 3 valores del RGB?

RGB(128,128,128) = Gris oscuro

RGB(192,192,192) = Gris claro

 

Y hay metodos para obtener el color de un pixel.. no se si esto te sirve..

 

No me interesa ver la tonalidad del gris. Sólo me basta con verificar que efectivamente el pixel sea gris. ES decir los 3 valores iguales.

En realidad si leo los valores del pixel. Este es el algoritmo:


delphi
  1. Gray := true;
  2. for y := 0 to Bitmap.Heigth - 1 do
  3. begin
  4. p := Bitmap.Scanline[y];
  5. for x := 0 to Bitmap.Width - 1 do
  6. begin
  7. // operaciones con el pixel
  8. // verificar grisado
  9. if (p^.blue <> p^.green) OR (p^.blue <> p^.red)
  10. then Gray := false;
  11. inc(p)
  12. end;
  13. end;

Al final de toda la lectura. Si resulta ser que algún pixel no es tono gris en Gray quedará el valor false. Esa es la idea. Mi duda es si me hace falta alguna evaluación más.

 

Saludos,


  • 0

#4 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 11 junio 2015 - 10:47

Hola Delphius

 

Yo lo veo de esta manera:


php
  1. Grey := NOT ((Blue <> Green) OR (Blue <> Red));

Esta expresión es equivalente a lo siguiente aplicando las leyes de De Morgan


php
  1. Grey := (Blue = Green) AND (Blue = Red);

Podemos concluir por la propiedad de transitividad en la igualdad que


php
  1. Si Blue = Green y Blue = Red => Green = Red

Es decir que para determinar si el pixel es de tono gris ya no es necesario comparar entre Green y Red.

 

 

Saludos


  • 1

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 junio 2015 - 11:05

Gracias Héctor por aclarar mi duda.

Que vergüenza la mía, algo básico... y yo sufriendo un lapsus por eso.

 

No te imaginas a las cosas que uno duda a las noches después de haberse gastado los dedos, y las poca neuronas que le quedan. Me falta un buen sueño reparador... Ha... ¡Y quiero vacaciones! :D

 

Saludos,


  • 0

#6 cram

cram

    Advanced Member

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

Escrito 11 junio 2015 - 11:16

Delphius, es gris un color cuyos valores R, G y B son iguales. cualquier variación será de un color, ya que aunque sea mínima, marcará la tendencia mayor a uno de los tres canales.

TRGB es un registro y permite que accedas a los valores de R, G y B.


php
  1. EsGris:= (RGB.R = RGB.G) and (RGB.G = RGB.B);

El color gris podrá ser más cercano a negro cuando sus canales tienen menor valor que 128 y más cercano al blanco cuando tienen un valor sobre 127.
 Siendo el gris (puro, llamémosle así) al formado por R = 127, G = 127 y B = 127.

 

Saludos.


Editado por cram, 11 junio 2015 - 11:19 .

  • 0

#7 cram

cram

    Advanced Member

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

Escrito 11 junio 2015 - 11:22

Disculpas, Hector Randolph dice llo mismo, solo que con otras palabras.

 

Me gusta la segunda opción Héctor.

 

Saludos


  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 11 junio 2015 - 03:48

Delphius, es gris un color cuyos valores R, G y B son iguales. cualquier variación será de un color, ya que aunque sea mínima, marcará la tendencia mayor a uno de los tres canales.

TRGB es un registro y permite que accedas a los valores de R, G y B.


php
  1. EsGris:= (RGB.R = RGB.G) and (RGB.G = RGB.B);

El color gris podrá ser más cercano a negro cuando sus canales tienen menor valor que 128 y más cercano al blanco cuando tienen un valor sobre 127.
 Siendo el gris (puro, llamémosle así) al formado por R = 127, G = 127 y B = 127.

 

Saludos.

 

Cram. La teoría y la práctica la se ;)  Fue un buen lapsus. Lo que me pasó es que estuve demasiado frente a la PC y bue... los cables se quemaron. :lol:

 

Saludos,


  • 0





Etiquetado también con una o más de estas palabras: if, condición, lógica

IP.Board spam blocked by CleanTalk.