FC2カウンター FPGAの部屋 Vivado HLS でRGB2HSV IPを作る3(H の表現方法)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vivado HLS でRGB2HSV IPを作る3(H の表現方法)

Vivado HLS でRGB2HSV IPを作る2(Cシミュレーション)”の続き。

前回のH(色相)の画像は、 360 までの値を 255 までにスケールを変えて表示していたのだが、360 までということは円なので、0 も赤だが、360 も赤に戻る。これでは、360 までの値を 255 にスケールを変えて表示しても意味がないと思った。HSV2RGB 変換しても元の画像に戻るだけだ。そうだ、S = V = 255 としてH をHSV2RGB 変換すれば色がはっきり見えるはずではないか?ということで、やってみた。

参考にするWeb サイトは例によって”RGBとHSV・HSBの相互変換ツール”と変換計算式”を参考にさせて頂いた。

C のテストベンチのコードのHSV2RGB 変換の部分を示す。S = V = 255 のときは、MAX = 255, MIN = 0 となる。

    for (int y=0; y<bmpihr.biHeight; y++){
        for (int x=0; x<bmpihr.biWidth; x++){
            switch(select_hsv){
            case H:
                h = (pixel_buf[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x]>>16) & 0x1ff;
                if(h>=0 && h<60){
                    r = 255;
                    g = (int)(((float)h/60.0)*255.0+0.5);
                    b = 0;
                }else if(h>=60 && h<120){
                    r = (int)(((120.0-(float)h)/60.0)*255+0.5);
                    g = 255;
                    b = 0;
                }else if(h>=120 && h<180){
                    r = 0;
                    g = 255;
                    b = (int)((((float)h-120.0)/60.0)*255+0.5);
                }else if(h>=180 && h<240){
                    r = 0;
                    g = (int)(((240.0-(float)h)/60.0)*255+0.5);
                    b = 255;
                }else if(h>=240 && h<300){
                    r = (int)((((float)h-240.0)/60.0)*255+0.5);
                    g = 0;
                    b = 255;
                }else// h>=300 && h<=360
                    r = 255;
                    g = 0;
                    b = (int)(((360.0-(float)h)/60.0)*255+0.5);
                }
                break;
            case S:
                sv = (pixel_buf[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] >> 8) & 0xff;
                break;
            default// case V:
                sv = pixel_buf[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] & 0xff;
                break;
            }


これで、road_1.bmp を RGB2HSV 変換したときの H の画像のハードウェア、つまり固定小数点 8 桁で演算したときの h_hw.bmp と浮動小数点演算の h_sw.bmp を示す。
rgb2hsv_15_161016.png

サイケデリックな絵のようになった。ブロック単位になっているのは、JPEG圧縮のせいではないか?ということをツィッターで教えて頂いた。ありがとうございました。

原画像の道路の写真をもう一度見てみよう。
rgb2hsv_11_161014.jpg

道路は彩度が低く、色相も変化が激しいので、彩度や明度が低いときは色相を信じないほうがよさそうだ。

今まで、追跡マーカーを色相だけで追跡しようとしていたのだが、彩度や明度も考慮する必要がありそうだ。
  1. 2016年10月16日 06:00 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3603-ce9961c2
この記事にトラックバックする(FC2ブログユーザー)