安卓颜色飞溅

Posted

技术标签:

【中文标题】安卓颜色飞溅【英文标题】:Android color splash 【发布时间】:2018-09-08 01:00:29 【问题描述】:

有人可以给我推荐一个快速的方法或颜色飞溅效果的库吗?例如,我选择了一种颜色,一张照片的所有颜色都变得不饱和,除了我选择的颜色。

我曾尝试使用逐像素颜色检查,然后替换颜色,但对于大图像来说太慢了。

int width = originalImage.getWidth();
int height = originalImage.getHeight();
int[] pixels = new int[width * height];
originalImage.getPixels(pixels, 0, width, 0, 0, width, height);

for (int x = 0; x < pixels.length; ++x) 
     pixels[x] = Distance(pixels[x], fromColor) < 4 ? targetColor : pixels[x];


Bitmap newImage = Bitmap.createBitmap(width, height, originalImage.getConfig());
newImage.setPixels(pixels, 0, width, 0, 0, width, height);


public int Distance(int a, int b) 
     return Math.abs(Color.red(a) - Color.red(b)) + Math.abs(Color.green(a) -
                     Color.green(b)) + Math.abs(Color.blue(a) - Color.blue(b));

编辑:

这是原始图像和处理后的图像,我保留的颜色是#ff9350:

【问题讨论】:

@AnderBiguri 是的,我的错误是我在之前的评论中要求的预期输出图像 你用什么语言太慢了? 您可能必须将此部分拆分为 c++ 并在 neon 中执行操作。如果一切顺利,理论上 8 位整数的速度可以提高 16 倍,32 位整数的速度可以提高 4 倍。 我不会说 android,所以我看不到您去饱和的代码 - 请您添加它,或者找出执行它的行吗? 这段代码只检查颜色是否与我选择的颜色相似,而且单独速度很慢,换色更慢。 【参考方案1】:

您可以尝试检查可能的颜色RGB 值并准备HashSet 仅包含那些不应该包含的颜色值 去饱和。看起来应该没有很多值。

之后,您将能够检查颜色是否应该去饱和。因此,对于新的给定颜色,您将获得相当长的预计算,但转换照片的代码会变得更快。

可以这样实现(没有在Android下测试过,只是某种Java的伪代码来展示这个想法):

// precalculation
Set<Color> keptColors = new HashSet<Color>();
final int MAX_DISTANCE = 4;
for (int r=red(fromColor)-MAX_DISTANCE; r<=red(fromColor)+MAX_DISTANCE; r++) 
    for (int g=green(fromColor)-MAX_DISTANCE; g<=green(fromColor)+MAX_DISTANCE; g++) 
        for (int b=blue(fromColor)-MAX_DISTANCE; b<=blue(fromColor)+MAX_DISTANCE; b++) 
            if (Distance(rgb(r,g,b)), fromColor) < MAX_DISTANCE 
                keptColors.add(rgb(r,g,b));
            
        
    

...

// in you photo processing code
keptColors.contains(pixels[x]) ? pixels[x] : targetColor;

【讨论】:

如何检查所有可能的颜色 RGB? 我添加了一个可能的实现示例 为什么哈希计算比距离计算快? hashset 的计算速度并不快,但是当hashset 被计算时,你不需要计算每个像素的颜色距离,你只需查找它的颜色是否存在于@987654328 @ 比颜色距离计算更快。因此,您在开始处理照片之前会花一些时间,但之后处理会更快。 经过一番思考后,我意识到,使用您的距离计算算法,通过fromColor 颜色分量值周围的±4 个值就足够了,以获得通过距离检查的所有值。我改进了算法,但是省略了迭代颜色分量值在其限制(0..255)内的检查,请自行添加【参考方案2】:

在 OpenCV 中使用 inRange 函数来隔离颜色

Scalar lower(0,100,100);
Scalar upper(10,255,255);
Core.inRange(hsv, lower, upper, segmentedImage);

看看这个Answer

【讨论】:

以上是关于安卓颜色飞溅的主要内容,如果未能解决你的问题,请参考以下文章

安卓自定义View基础 - 颜色

安卓自定义View基础 - 颜色

安卓自定义View基础-颜色

安卓状态栏文字颜色修改

安卓利用动画设置背景颜色

安卓相机X |颜色检测