SystemVerilog|BMPファイルを2値化する

Systemverilog

BMPファイルを読み込んで2値化して保存します

サンプルコード

グレースケールのBMPファイルを読み込み、同じ画像サイズで保存します

IMG_H,IMG_Wで画像の高さ、幅を指定しています

module tb;
    localparam IMG_H = 512;
    localparam IMG_W = 512;

    bit [7:0] bmp[54+1024];  // bmpのヘッダ情報を保持する
    bit [7:0] data[IMG_H*IMG_W]; // 入力画像の画素データ
    bit [7:0] dout[IMG_H*IMG_W]; // 出力画像の画素データ

    int f;
    initial begin
        f = $fopen("mandrill.bmp", "rb"); // ファイルを開く
        $fread(bmp, f, 0, 54+1024); // ヘッダ情報を取得する
        $fread(data, f, 0, IMG_H*IMG_W); // 画素データを取得する
        $fclose(f); // ファイルを閉じる

        work(data, dout); // workというtaskで画像を2値化する

        f = $fopen("result.bmp", "wb"); // 画像を保存する
        foreach (bmp[i])
            $fwrite(f, "%c", bmp[i]);
        foreach (dout[i])
            $fwrite(f, "%c", dout[i]);
        $fclose(f);
    end

    // dinを2値化してdoutとして出力するtask
    task work(
        input bit [7:0] din[IMG_H*IMG_W],
        output bit [7:0] dout[IMG_H*IMG_W]
    );
        foreach (din[i]) begin
            if (din[i] > 127) begin // 128以上は白
                dout[i] = 255;
            end
            else begin // 127以下は黒
                dout[i] = 0;
            end
        end
    endtask
endmodule
入力画像
出力画像

まとめ

BMPファイルを2値化して保存しました

コメント

タイトルとURLをコピーしました