Hola, estoy trabajando en un proyecto de procesamiento de imágenes en el que trato de cambiar el brillo de un píxel. El código que escribí funciona, pero no de la forma en que quiero que sea. Aquí está el segmento de código que utilizo para cambiar el brillo del píxel. Lo que sucede aquí es que verifico los valores RGB de un píxel para determinar si esos valores están abiertos para cambiar. Para atenuar el píxel, resto 1 y para resaltar el píxel agrego 1 a los valores RGB. Sin embargo, este enfoque da resultados muy feos. ¿Cómo puedo modificar el algoritmo que estoy usando? Por cierto, acabo de compartir la parte utilizada para el brillo. Otra parte (Contraste) no está incluida aquí. Ese es el motivo por el que el código parece incompleto. No soy experto ni conocedor del procesamiento de imágenes.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.NUMERIC_STD.all;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_arith.all;
entity Brightness_Contrast is
generic (
PICTURE_WIDTH_HEIGHT : integer := 250;
COLOR_BIT : integer := 4);
port (
clk_in : in std_logic := '0';
operation : in std_logic_vector(1 downto 0);
rst: in std_logic;
data_in: in std_logic_vector(11 downto 0);
output_of_operation: out std_logic_vector(11 downto 0);
mode: in std_logic
);
end Brightness_Contrast;
architecture Behavioral of Brightness_Contrast is
signal check : std_logic_vector(11 downto 0) := (others => '0');
begin
BRIGHTNESS_CONTRAST: process(rst,data_in,clk_in,operation,mode) is
begin
check <= data_in;
if rst = '1' then
check <= (others => '0');
elsif rising_edge(clk_in) then --clk
if operation = "00" then
if mode = '0' then
if check(3*COLOR_BIT-1 downto 2*COLOR_BIT) < "1110" then
check(3*COLOR_BIT-1 downto 2*COLOR_BIT) <= ((check(3*COLOR_BIT-
1 downto 2*COLOR_BIT)) + "0010");
end if;
if check(2*COLOR_BIT-1 downto COLOR_BIT) < "1110" then
check(2*COLOR_BIT-1 downto COLOR_BIT) <= ((check(2*COLOR_BIT-1
downto COLOR_BIT)) + "0010");
end if;
if check(COLOR_BIT-1 downto 0) < "1110" then
check(COLOR_BIT-1 downto 0) <= ((check(COLOR_BIT-1 downto 0)) +
"0010");
end if;
elsif mode = '1' then
if check(3*COLOR_BIT-1 downto 2*COLOR_BIT) > "0001" then
check(3*COLOR_BIT-1 downto 2*COLOR_BIT) <= ((check(3*COLOR_BIT-
1 downto 2*COLOR_BIT)) - "0010");
end if;
if check(2*COLOR_BIT-1 downto COLOR_BIT) > "0001" then
check(2*COLOR_BIT-1 downto COLOR_BIT) <= ((check(2*COLOR_BIT-1
downto COLOR_BIT)) - "0010");
end if;
if check(COLOR_BIT-1 downto 0) > "0001" then
check(COLOR_BIT-1 downto 0) <= ((check(COLOR_BIT-1 downto 0)) -
"0010");
end if;
elsif operation = "01" then
if mode = '0' then
if check(3*COLOR_BIT-1 downto 2*COLOR_BIT) < "1000" and
check(3*COLOR_BIT-1 downto 2*COLOR_BIT) > "0001" then
check(3*COLOR_BIT-1 downto 2*COLOR_BIT) <= ((check(3*COLOR_BIT-1
downto 2*COLOR_BIT)) - "0010");
elsif check(3*COLOR_BIT-1 downto 2*COLOR_BIT) > "0111" and
check(3*COLOR_BIT-1 downto 2*COLOR_BIT) < "1110" then
check(3*COLOR_BIT-1 downto 2*COLOR_BIT) <= ((check(3*COLOR_BIT-1
downto 2*COLOR_BIT)) + "0010") ;
end if;
if check(2*COLOR_BIT-1 downto COLOR_BIT) < "1000" and
check(2*COLOR_BIT-1 downto COLOR_BIT) > "0001" then
check(2*COLOR_BIT-1 downto COLOR_BIT) <= ((check(2*COLOR_BIT-1
downto COLOR_BIT)) - "0010");
elsif check(2*COLOR_BIT-1 downto COLOR_BIT) > "0111" and
check(2*COLOR_BIT-1 downto COLOR_BIT) < "1110" then
check(2*COLOR_BIT-1 downto COLOR_BIT) <= ((check(2*COLOR_BIT-1
downto COLOR_BIT)) + "0010") ;
end if;
if check(COLOR_BIT-1 downto 0) < "1000" and check(COLOR_BIT-1
downto 0) > "0001" then
check(COLOR_BIT-1 downto 0) <= ((check(COLOR_BIT-1 downto 0)) -
"0010");
elsif check(COLOR_BIT-1 downto 0) > "0111" and check(COLOR_BIT-1
downto 0) < "1110" then
check(COLOR_BIT-1 downto 0) <= ((check(COLOR_BIT-1 downto 0)) +
"0010") ;
end if;
elsif mode = '1' then
if check(3*COLOR_BIT-1 downto 2*COLOR_BIT) < "1000" and
check(3*COLOR_BIT-1 downto 2*COLOR_BIT) > "0010" then
check(3*COLOR_BIT-1 downto 2*COLOR_BIT) <= ((check(3*COLOR_BIT-1
downto 2*COLOR_BIT)) - "0011");
elsif check(3*COLOR_BIT-1 downto 2*COLOR_BIT) > "0111" and
check(3*COLOR_BIT-1 downto 2*COLOR_BIT) < "1101" then
check(3*COLOR_BIT-1 downto 2*COLOR_BIT) <= ((check(3*COLOR_BIT-1
downto 2*COLOR_BIT)) +"0011") ;
end if;
if check(2*COLOR_BIT-1 downto COLOR_BIT) < "1000" and
check(2*COLOR_BIT-1 downto COLOR_BIT) > "0010" then
check(2*COLOR_BIT-1 downto COLOR_BIT) <= ((check(2*COLOR_BIT-1
downto COLOR_BIT)) - "0011");
elsif check(2*COLOR_BIT-1 downto COLOR_BIT) > "0111" and
check(2*COLOR_BIT-1 downto COLOR_BIT) < "1101" then
check(2*COLOR_BIT-1 downto COLOR_BIT) <= ((check(2*COLOR_BIT-1
downto COLOR_BIT)) +"0011") ;
end if;
if check(COLOR_BIT-1 downto 0) < "1000" and check(COLOR_BIT-1
downto 0) > "0010" then
check(COLOR_BIT-1 downto 0) <= ((check(COLOR_BIT-1 downto 0)) -
"0011");
elsif check(COLOR_BIT-1 downto 0) > "0111" and check(COLOR_BIT-1
downto 0) < "1101" then
check(COLOR_BIT-1 downto 0) <= ((check(COLOR_BIT-1 downto 0)) +
"0011") ;
end if;
end if; --mode
end if; --Operation
end if; --CLK
end process BRIGHTNESS_CONTRAST ;
output_of_operation <= check;
end Behavioral;