Red -convertendo imagens para tons de cinza

Resolvi fazer um programa em Red (lembrando que ainda está em desenvolvimento e na versão 0.6) para converter uma imagem colorida em preto e branco (tonalidades de cinza). Basta que as cores R, G e B possuam o mesmo valor para que a imagem seja mostrada com tonalidades de cinza. Basicamente temos seis formas de conversão, cada qual apresentando resultados característicos.

Claridade

O nível do cinza será calculado como
Claridade = (max(R, G, B) + min(R, G, B)) / 2

Luminosidade

O nível do cinza será calculado como
Luminosidade = 0.21 × R + 0.72 × G + 0.07 × B

Brilho Médio

O nível do cinza será calculado como
Brilho médio = (R + G + B) / 3

Canais

Escolhemos um dos canais (R, G, B) e replicamos e seu valor nos outros dois canais. Esta técnica simula uma foto feita com um filme preto e branco com a utilização de um filtro com uma das cores dos canais. O resultado é que as cores complementares serão bloqueadas deixando passar apenas a cor do filtro. Utilizando um filtro vermelho em uma foto onde aparece o céu azul e com nuvens brancas, o céu ficará bem mais escuro entregando uma maior dramaticidade para a foto.

O efeito obtido por cada uma das técnicas pode ser visto nas imagens abaixo.
Como a parte gráfica para Mac e Linux ainda estão em desenvolvimento (a do Windows também mas está mais próxima do resultado final), o programa só roda no Windows. Futuramente deverá rodar no Mac, Linux, etc..

Casualmente o programa ficou com 100 linhas como pode ser visto abaixo.

Resultado das diferentes conversões para visualizar a diferença entre elas:

O programa ainda sofrerá alterações mas, por enquanto, era isto.

Anúncios

2 opiniões sobre “Red -convertendo imagens para tons de cinza

  1. Very nice code,
    I just made some little improvements to remove duplicated code blocks, here my desaturate function:

    desaturate: function [
    image
    /Lightness
    /Luminosity
    /RedChannel
    /GreenChannel
    /BlueChannel
    /local img
    ][
    img: copy image

    ;choose the action
    action: case [
    Lightness [
    [t/1: t/2: t/3: ((max max (t/1) (t/2) (t/3)) + (min min (t/1) (t/2) (t/3))) / 2]
    ]
    Luminosity [
    [t/1: t/2: t/3: to integer! ((t/1 * 0.21) + (t/2 * 0.72) + (t/3 * 0.07))]
    ]
    RedChannel [
    [t/2: t/3: t/1]
    ]
    GreenChannel [
    [t/1: t/3: t/2]
    ]
    BlueChannel [
    [t/1: t/2: t/3]
    ]
    true [
    [t/1: t/2: t/3: ((t/1 + t/2 + t/3) / 3)]
    ]
    ]
    ;apply to image
    forall img [
    t: img/1
    do action
    img/1: t
    ]
    return img
    ]

Os comentários estão desativados.