lunes, 16 de enero de 2017

IMÁGENES RGB

RGB

Es el acrónimo inglés Red, Green, Blue, Rojo, Verde, Azul).

En el modelo RGB, cada color aparece en sus componentes espectrales primarios de rojo, verde y azul. Este modelo está basado en un sistema coordenado Cartesiano. El subespacio de interés para el modelo RGB es un cubo.

Los valores RGB son las tres esquinas del cubo que interceptan los ejes; el cyan, magenta y amarillo son las otras tres esquinas; el negro esta en el origen; y el blanco en la esquina más lejana al origen. En este modelo, la escala de grises (valores iguales de R,G y B) se extienden sobre la línea que une el negro con el blanco. [1]


Figura 1. Este cubo muestra de manera gráfica el modelo RGB. 


Considere una imagen RGB en el que cada imagen roja, verde y azul es una imagen de 8-bits. Bajo estas condiciones cada pixel de color RGB [esto es, una tripleta de valores (R,G,B)] se dice que tiene 24 bits de profundidad (3 planos imagen por el número de bits por plano). El término imagen de color total (full color) se utiliza generalmente para denotar una imgen de color RGB de 24-bits. El número total de colores de una imagen RGB de 24-bits es (28)3=16,777,216.[1]


MODELO DE COLOR HSI 

Corresponden a implementaciones más "precisas" del punto de vista psicovisual, del modelo de Matiz (H), Saturación (S) e Intensidad (I).
Esta transformación deriva del modelo RGB. El cubo RGB se transforma en el cilindro HSI.[2]

* La saturacion  corresponde a la distancia radial 
* El matiz corresponde al ángulo del sistema de coordenadas polar.
*La intensidad es el eje perpendicular al plano de coordenadas polares.



Figura 2. Esta imagen representa al espacio HSI


Conversión RGB a HSI

Esta dado de la siguiente manera:[2]




Código del modelo HSI.


import cv2
import numpy as np
import math

image = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Manzana.jpg',1)
ima = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Manzana.jpg',0)

row , col = ima.shape

H=np.zeros((row,col))
S=np.zeros((row,col))
I=np.zeros((row,col))

r=np.zeros((row,col))
g=np.zeros((row,col))
b=np.zeros((row,col))

image2 = np.zeros((row,col,3))



for i in range(row):
    for j in range(col):
        r[i,j]=image[i,j,0]/255.0
        g[i,j]=image[i,j,1]/255.0
        b[i,j]=image[i,j,2]/255.0



def color(r,g,b,row,col):
    paso1=1
    paso2=1
    p=1/2
    for i in range(row):
        for j in range(col):
            paso1=p*((r[i,j]-g[i,j])+(r[i,j]-b[i,j]))
            paso2=((r[i,j]-g[i,j])**2)+(r[i,j]-b[i,j])*(g[i,j]-b[i,j])
            paso2=paso2**(1/2)
            if(b[i,j] <= g[i,j]):
                H[i, j] =(math.acos(paso1/paso2))/360
            if(b[i,j]>g[i,j]):
                H[i,j]=(360-(math.acos(paso1/paso2)))/360
    return H


def saturacion(r,g,b):
    #min1 = 4
    row , col = b.shape
    for i in range(row):
        for j in range(col):
            if(r[i,j]<=g[i,j]):
                if(r[i,j]<=b[i,j]):
                    min1 = r[i,j]
            else:
                if(g[i,j]<=b[i,j]):
                    min1=g[i,j]
                else:
                    min1=b[i,j]
            S[i,j]=1-(3/(r[i,j]+g[i,j]+b[i,j]))*min1
    return S



def intensidad(r, g, b):  # metodo i
    row, col = r.shape
    for i in range(row):
        for j in range(col):
            I[i,j]=(r[i,j]+g[i,j]+b[i,j])*1/3
    return I


def conversion(r, g, b,H,S,I,row,col):  # metodo i
    for i in range(row):
        for j in range(col):
            H[i,j]=H[i,j]*360
            if(H[i,j]==0):
                b[i,j]=I[i,j]-((I[i,j]*S[i,j]))
                r[i,j]=I[i,j]+2*(I[i,j]*S[i,j])
                g[i,i]=I[i,j]-I[i,j]*S[i,j]
            if(H[i,j]==120):
                b[i,j]=I[i,j]-I[i,j]*S[i,j]
                r[i,j]=I[i,j]-I[i,j]*S[i,j]
                g[i,i]=I[i,j]+2*(I[i,j]*S[i,j])
            if(H[i,j]==240):
                b[i,j]=I[i,j]+2*(I[i,j]*S[i,j])
                r[i,j]=I[i,j]-I[i,j]*S[i,j]
                g[i,i]=I[i,j]-I[i,j]*S[i,j]
            if(H[i,j]>0 and H[i,j]<120 ):
                b[i,j]=I[i,j]*(1-S[i,j])
                r[i,j]=I[i,j]*(1+(S[i,j]*math.cos(H[i,j]))/(math.cos(60-H[i,j])))
                g[i,j]=3*I[i,j]-(r[i,j]+b[i,j])
            if(120< H[i,j] and H[i,j]<240 ):
                H[i,j]=H[i,j]-120
                r[i,j]=I[i,j]*(1-S[i,j])
                g[i,j]=I[i,j]*(1+(S[i,j]*math.cos(H[i,j]))/(math.cos(180-H[i,j])))
                b[i,j]=3*I[i,j]-(r[i,j]+g[i,j])
            if(240< H[i,j] and H[i,j]<360 ):
                H[i,j]=H[i,j]-240
                g[i,j]=I[i,j]*(1-S[i,j])
                b[i,j]=I[i,j]*(1+(S[i,j]*math.cos(H[i,j]))/(math.cos(300-H[i,j])))
                r[i,j]=3*I[i,j]-(g[i,j]+b[i,j])
    return r,g,b


H= color(r,g,b,row,col)
S = saturacion(r,g,b)
I = intensidad(r,g,b)
r,g,b=conversion(r,g,b,H,S,I,row,col)

for i in range(row):
    for j in range(col):
        image2[i,j,0]=(r[i,j])
        image2[i,j,1]=(g[i,j])
        image2[i,j,2]=(b[i,j])

cv2.imshow('convertida',image2)
cv2.imshow('i',I)
cv2.imshow('original',image)
cv2.waitKey(0)
cv2.destroyAllWindows()






 Figura 3. Ejemplo de una imagen original, monocromática y su modelo HSI. 







 Figura 4. Otro ejemplo de una imagen original  monocromática y su modelo HSI. 




Referencias

[1]http://www2.elo.utfsm.cl/~elo328/pdf1dpp/PDI13_Color_1dpp.pdf
[2]http://turing.iimas.unam.mx/~elena/PDI-Mast/Tema_6_C.pdf

  Consulta 13 de Enero del 2017
  Consulta 15 de Enero del 2017