Abre una imagen y lee sus valores de píxeles

3

Quiero calcular el histograma de una imagen en modo de escala de grises

He diseñado una memoria y un valor de calculadora de histograma, ahora quiero obtener valores de píxeles y ponerlos en la calculadora como entrada

Tengo una imagen (por ejemplo, un mapa de bits), debería abrirla y escanear sus píxeles, pero no tengo ni idea de cómo hacerlo

¿Hay una función en ModelSim para abrir una imagen? (Como File_Open para archivos de texto)

¿Cómo debo leer sus valores de píxeles?

    
pregunta G3ntle_Man

2 respuestas

2

Puede guardar su imagen como una imagen PPM (Wiki) . Luego puedes cargarlo o guardarlo como archivo de texto

    
respondido por el Botnic
1

Desafortunadamente, no creo que haya una forma de hacerlo usando solo VHDL y ModelSim. Lo más probable es que desee utilizar un lenguaje de secuencias de comandos como MatLab o Python para generar un archivo de texto ASCII que se puede leer desde VHDL.

Escribí la siguiente función en Matlab para realizar la conversión de datos de imagen en escala de grises de 16 bits.

% Convert an image to a VHDL compatible input file
function img_to_vhdl_txt(grayscale_img,filename)
    % Invert image.
    grayscale_img = grayscale_img';
    % Columnize the image and convert each pixel to a 4 digit hex string
    hex_stream = cellstr(num2str(grayscale_img(:),'%04x'));
    % write out file using new line as the delimter
    dlmwrite(filename, hex_stream, '-append', 'delimiter', '', 'newline', 'pc');
end

Una vez que genere el archivo de datos necesario, puede leerlo en un píxel a la vez utilizando este componente VHDL:

    ----------------------------------------------------------------------------------
-- Reads bytes from a file located at the path specified in the "input_file" 
-- declaration. At the end of the file EOF is set high.
--
-- Expects ASCII hex data as the input. Reads one line per clock. For example,
-- if the desired output is: 01,23,45,67,89,AB,CD,EF the input text file should
-- contain:
-- 01
-- 23
-- 45
-- ..
-- EF
--  
----------------------------------------------------------------------------------


--include this library for file handling in VHDL.
library IEEE;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_textio.all;

library std;
use std.textio.all;  --include package textio.vhd

--entity declaration
entity read_file is
    generic
    (
        sim_file            :   string := "..\..\Testbench\image_in.raw";
        DATA_WIDTH          :   integer := 12;
        DATA_WIDTH_BYTES    :   integer := 2
    );
    port
    (
        clk     : in    std_logic;
        enable  : in    std_logic;
        eof     : out   std_logic;
        valid   : out   std_logic;
        data    : out   std_logic_vector(DATA_WIDTH-1 downto 0)
    );
end read_file;

--architecture definition
architecture Behavioral of read_file is


  -- file declaration
  -- type "text" is already declared in textio library
  FILE input_file  : text OPEN read_mode IS sim_file;

BEGIN

-- Read process
PROCESS(clk)
    -- file variables
    VARIABLE vDatainline : line;
    VARIABLE vDatain     : std_logic_vector((DATA_WIDTH_BYTES*8)-1 DOWNTO 0);

BEGIN
    if rising_edge(clk) then
        valid <= '0';
        if not endfile(input_file) then
            if enable = '1' then
                readline (input_file, vDatainline);         -- Get line from input file
                hread (vDatainline, vDatain);               -- Read line as Hex
                valid <= '1';                               -- Data is valid
                data <= ((vDatain(DATA_WIDTH-1 downto 0))); -- Convert variable to signal
            end if;
            eof <= '0';
        else
            eof <= '1';
        end if;
    end if;

  END PROCESS;

end Behavioral;

Alternativamente, puede intentar generar un archivo de inicialización de memoria (Altera = .mif, Xilinx = .coe) a partir de los datos (una vez más usando un script o programa externo) y generar una ROM IP para la simulación utilizando las herramientas de Altera / Xilinx.

Espero que esto ayude (y si encuentra una mejor manera de hacerlo, vuelva a publicar aquí)

    
respondido por el ks0ze

Lea otras preguntas en las etiquetas