安顿OV7670录像头搜集到的数量是PRADOGB565,功能是从图像中领到非凡的水彩提供UI使用

  学习博客:http://lhtao31.blog.163.com/blog/static/2972647020103814044158/

Android 上有一个相当短小精悍的库 ——
Palette,整个库独有PaletteTargetColorCutQuantizer八个公文,
功效是从图像中领取卓绝的颜色提供UI使用。

  目前在上学调节和测量试验摄像头,配置OV7670录制头收罗到的多寡是途观GB565,移植外人的代码,从ZYNQ移植到Basys3,VGA输出引脚供给又PAJEROGB565转到RubiconGB444,作者利用分别取揽胜极光GB565三份量高位的办法,最后呈现输出,摄像图像会变得更模糊,那是出于在改变的时候去掉低位会损失精度。而OV7670的图像收罗效果也是平日,所未来边会尝试配置OV7725,追求完美,达到越来越好的显得效果。查询了无数质感后,知道了那是怎么着原因,下边作者本人查阅的材质整理一下,今后查询起来方便。

咋样行使

导入信赖包

implementation 'com.android.support:palette-v7:27.0.2'

回顾利用

//需要传入要提取的图片 bitmap
val builder = Palette.from(bitmap)
builder.generate(Palette.PaletteAsyncListener { palette ->
     /**
     * palette.getVibrantSwatch();       //获取到充满活力的色调
     * palette.getDarkVibrantSwatch();    //获取充满活力的黑
     * palette.getLightVibrantSwatch();   //获取充满活力的亮
     * palette.getMutedSwatch();          //获取柔和的色调
     * palette.getDarkMutedSwatch();     //获取柔和的黑
     * palette.getLightMutedSwatch();   //获取柔和的亮
     */
    //获取color值
    val swatch: Palette.Swatch? = palette.lightVibrantSwatch
    val color = swatch.rgb
    }
})

如上代码所示,提取图片上的颜色须要传入 bitmap,Palette
私下认可给了6种提取色调的连串。

1 /* vga_red   <= frame_pixel[15:11];
2 vga_green <= frame_pixel[10:5];
3 vga_blue  <= frame_pixel[4:0]; */
4 vga_red   <= frame_pixel[15:12];
5 vga_green <= frame_pixel[10:7];
6 vga_blue  <= frame_pixel[4:1];

源码深入分析

Palette有二种早先化方法,约等于同步和异步方法,使用
Builder构造器时私下认可使用的是异步方法。每个格局下都得以提供调色板大小参数来设置

// 最好在线程中使用
// 默认调色板大小.
private static final int DEFAULT_CALCULATE_NUMBER_COLORS = 16;
Palette p = Palette.generate(bitmap);
//设置调色板大小numcolor
Palette p = Palette.generate(bitmap, numcolor);

// 内部使用AsyncTask
Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
    @Override
    public void onGenerated(Palette palette) {
        // palette为生成的调色板
    }
});
// 设置调色板大小
Palette.generateAsync(bitmap, numcolor, new Palette.PaletteAsyncListener() {
    @Override
    public void onGenerated(Palette palette) {
        // palette为生成的调色板
    }
})

当我们传入 Bitmap 后会首先对 Bitmap 做拍卖

// First we'll scale down the bitmap if needed
final Bitmap bitmap = scaleBitmapDown(mBitmap);

/**
 * Scale the bitmap down as needed.
 */
private Bitmap scaleBitmapDown(final Bitmap bitmap) {
    double scaleRatio = -1;

    if (mResizeArea > 0) {
        final int bitmapArea = bitmap.getWidth() * bitmap.getHeight();
        if (bitmapArea > mResizeArea) {
            scaleRatio = Math.sqrt(mResizeArea / (double) bitmapArea);
        }
    } else if (mResizeMaxDimension > 0) {
        final int maxDimension = Math.max(bitmap.getWidth(), bitmap.getHeight());
        if (maxDimension > mResizeMaxDimension) {
            scaleRatio = mResizeMaxDimension / (double) maxDimension;
        }
    }

    if (scaleRatio <= 0) {
        // Scaling has been disabled or not needed so just return the Bitmap
        return bitmap;
    }

    return Bitmap.createScaledBitmap(bitmap,
            (int) Math.ceil(bitmap.getWidth() * scaleRatio),
            (int) Math.ceil(bitmap.getHeight() * scaleRatio),
            false);
}

诸如此比做为了避防 Bitmap
太大而产生计算消耗多量能源,暗中同意的ResizeArea大小是112*112。

处理完 Bitmap 后通过 getPixelsFromBitmap(bitmap)
方法得到图像上的像素数组,然后经过 ColorCutQuantizer
来管理图像上色值。
获得色值后,就足以将那么些色值填入 Palette 中以便利用。

量化压缩与量化补偿

水彩量化算法

ColorCutQuantizer 是一个基于 中位切分法(Median cut)
的颜色量化器,首要功效正是从彩色图像中领到当中的核心颜色。

中位切分算法的规律很简短直接,将图像颜色看作是色彩空间中的长方体(VBox),从发轫整个图像作为多少个长方体开首,将PAJEROGB中最长的一面从颜色总计的中位数一切为二,使得到的几个长方体所包罗的像素数量同样,重复上述手续,直到最终切分获得长方体的数目相等宗旨颜色数量甘休。

图片 1

VBox.png

当中RAV4GB最长的二头意思是,比方说在具有像素中Red颜色的布满范围是(10-50),Green的遍布范围是(5-100),Blue的分布范围是(0-200)。那么此时就应当以Blue为尺度,分成左右两堆,一群的像素Blue值比中值小,另一堆像素Blue值比中值大。

而是一时有个别规范下VBOX里面包车型客车像素数量很少,譬喻达成过滤桃红和深湖蓝时候,这时候就不可能以看似二分法来切割VBOX,需求运用优先级队列实行排序,刚起头时这一类别以VBox仅以VBox所含有的像素数作为优先级考量,当切分次数变多过后,将体量*包蕴像素数作为优先级。

除外,算法中最首要的有个别是总计色彩分布直方图。大家供给将三个维度空间中的任意一点对应到一维坐标中的整数,那样技能以最快地速度定位这一颜料。假使选拔任何的25个人信息,那么大家用来保存直方图的数老板度至少借使224=16777216,既然是要提取颜色主旨(或是颜色量化),大家能够将颜色由宝马X5GB各8位压缩至5位,这样数首席营业官度唯有215=32768:

量化压缩,比方:
24bit RGB888 -> 16bit RGB565 的转换

24bit RGB888
R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2 B1
B0

16bit RGB656
R7 R6 R5 R4 R3 G7 G6 G5 G4 G3 G2 B7 B6 B5 B4 B3

表明:在24bit上以8位为一组数据,在16bit上以5要么6为一组数据,
量化位数从8bit到5bit或6bit,取原8bit的高位,量化上做了压缩,却损失了精度。

量化补偿,比方:16bit 牧马人GB565 -> 24bit 奥迪Q7GB888 的转移

16bit RGB656 R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0

24ibt RGB888 R4 R3 R2 R1 R0 0 0 0 G5 G4 G3 G2 G1 G0 0 0 B4 B3 B2 B1 B0
0 0 0

24ibt RGB888 R4 R3 R2 R1 R0 R2 R1 R0 G5 G4 G3 G2 G1 G0 G1 G0 B4 B3 B2
B1 B0 B2 B1 B0

表明:第二行的 24bit 库罗德GB888
数据为转移后,未举行填空的数据,在精度上会有损失
其三行的 24bit 君越GB888 数据为通过量化补偿的数量,对未有做了量化补偿


仿照效法资料:
wiki
Median_cut

WranglerGB565 与
中华VGB888的相互调换

量化压缩

24bit RGB888 -> 16bit RGB565 的转换

24ibt RGB888 {R7 R6 R5 R4 R3 R2 R1 R0} {G7 G6 G5 G4 G3 G2 G1 G0} {B7 B6
B5 B4 B3 B2 B1 B0}

16bit RGB565 {R7 R6 R5 R4 R3} {G7 G6 G5 G4 G3 G2} {B7 B6 B5 B4 B3}

量化位数从8bit到5bit或6bit,取原8bit的高位,量化上做了收缩,却损失了精度。

量化补偿

16bit RGB565 -> 24bit RGB888 的转换

16bit RGB565 {R4 R3 R2 R1 R0}{G5 G4 G3 G2 G1 G0}{B4 B3 B2 B1 B0}

24ibt RGB888 {R4 R3 R2 R1 R0 0 0 0 }{G5 G4 G3 G2 G1 G0 0 0 }{B4 B3 B2 B1
B0 0 0 0}

24ibt RGB888 {R4 R3 R2 R1 R0 R2 R1 R0}{ G5 G4 G3 G2 G1 G0 G1 G0}{ B4 B3
B2 B1 B0 B2 B1 B0}

第二行的 24bit 纳瓦拉GB888 数据为转移后,未进行填空的数量,在精度上会有损失

 24bit TiggoGB888 数据为通过量化补偿的数据,对没有做了量化补偿

总结

量化压缩的艺术:三个字——取高位

量化补偿的方法

  1. 将原数据填充至高位

  2. 对此未有,用原本数据的未有举办补给

  3. 只要如故有未填充的位,继续利用原有数据的未有进行循环补偿

循环补偿的定义

8bit RGB332 -> 24bit RGB888 的转换

8bit RGB332{ R2 R1 R0} { G2 G1 G0} { B1 B0}

24bit RGB888 { R2 R1 R0 0 0 0 0 0 }{ G2 G1 G0 0 0 0 0 0} { B1 B0 0 0 0 0
0 0}

24bit RGB888 { R2 R1 R0 R2 R1 R0 0 0 }{ G2 G1 G0 G2 G1 G0 0 0 }{ B1 B0
B1 B0 0 0 0 0}

24bit RGB888 { R2 R1 R0 R2 R1 R0 R2 R1} { G2 G1 G0 G2 G1 G0 G2 G1} { B1
B0 B1 B0 B1 B0 0 0}

24bit RGB888 { R2 R1 R0 R2 R1 R0 R2 R1 }{ G2 G1 G0 G2 G1 G0 G2 G1 }{ B1
B0 B1 B0 B1 B0 B1 B0}

从如上转账能够看来,B分量举行了四轮补偿

  举办那样的填补,在做色彩格式转化的时候,可以掌握的校正色彩效果,收缩精度上的损失。

  临时候,回过头来,会谢谢本身,当初苦逼写的那些博客没白写!

  记得在此之前玩过两周Arduino,调节和测验出了,实时采撷重力传感器的多少到贝壳物联突显,辛亏笔者随即做了一些笔记,以至于今后想用Arduino+FPGA做个类其余时候,不慢就会上手调节和测验了,所以,相当多谢自个儿立即苦逼的写博客做速记!

图片 2

 

转载请申明出处:NingHeChuan(宁河川)

私家微信订阅号:开源FPGANingHeChuan

假设您想立即接受个人写作的博文推送,能够扫描侧面二维码(恐怕长按识别二维码)关怀个体微信订阅号

知乎ID:NingHeChuan

微博ID:NingHeChuan

原来的文章地址:http://www.cnblogs.com/ninghechuan/p/7530878.html

相关文章