1

我正在尝试获得在 uiimage 中突出的颜色,如果这是照片,我会获得红色: 红色

我知道要获得平均颜色,我会使用下面的代码,但它会返回 nlack 或灰色作为平均颜色,我希望此代码获得红色。

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        unsigned char rgba[4];
        CGContextRef context = CGBitmapContextCreate(rgba, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

        CGContextDrawImage(context, CGRectMake(0, 0, 1, 1),  artworkImageView.image.CGImage);
        CGColorSpaceRelease(colorSpace);
        CGContextRelease(context);
        UIColor *colorOfArtwork;

         if(rgba[3]) {
            CGFloat alpha = ((CGFloat)rgba[3])/255.0;
            CGFloat multiplier = alpha/255.0;
            colorOfArtwork = [UIColor colorWithRed:((CGFloat)rgba[0])*multiplier
                                   green:((CGFloat)rgba[1])*multiplier
                                    blue:((CGFloat)rgba[2])*multiplier
                                   alpha:alpha];
        }
        else {
            colorOfArtwork =  [UIColor colorWithRed:((CGFloat)rgba[0])/255.0
                                   green:((CGFloat)rgba[1])/255.0
                                    blue:((CGFloat)rgba[2])/255.0
                                   alpha:((CGFloat)rgba[3])/255.0];
        }
4

2 回答 2

3

首先,在大多数情况下,这不是一个小问题。对人类来说似乎很明显的东西仍然很难在算法中编码,因为人类对“突出”的感知非常复杂。

如果您总是有只有一种颜色的灰度图像,这可能相对容易,但在蓝天下的相同图像可能更具挑战性。

对于您显示的图像,您可以遍历所有像素并将颜色转换为HSV。然后你只能考虑高于某个饱和度阈值的像素并计算它们的平均色调。正如我所说,这只适用于像您的示例图像这样的简单情况,其中实际上只有一种颜色,其余的是灰度。在其他情况下,您可能需要考虑像素的位置(中心附近的颜色可能更突出)并且不能简单地采用平均色调(对直方图进行聚类可以工作)。

我不会在这里详细介绍如何从图像中获取像素颜色值,您会在 SO 上找到一些关于此的帖子,例如这里

于 2012-08-25T17:34:01.543 回答
0

我做了一些与 omz 的回答非常相似的事情。

1)。遍历像素并捕获 UIImage 中最常见的颜色

2)。迭代最常见的颜色并找到具有最高(值+饱和度)总和的颜色。

当我访问http://colorizer.org时,我发现值(亮度)加上饱和度会起作用。饱和度为 0 为白色,值为 0 为黑色。与这些颜色相反,我注意到在大约 100% 的饱和度和值下,这些突出的颜色消退了。

我尝试但返回不太理想的另一个选项是将其转换为 HSL 并检索亮度。在 0 到 100 的范围内,50 是饱和度和值将是 100 的位置。因此,您不会获得饱和度和值的最高总和,而是遍历颜色以获得亮度最接近 50 的颜色。

我的代码如下:

#import "ImageHelper.h" //Found Here-> https://github.com/fylfot/MostResentColorUIImage/blob/master/MostRecentColor/ImageHelper.h

...

float maxDominatingFactor = 0.0;
UIColor *standOutColor;
NSArray *colors = [ImageHelper mostFrequentColors:30 of:self withColorPallete:ColorPalete512];
for(UIColor *color in colors){
    if(([color brightness] + [color saturation]) > maxDominatingFactor){
        standOutColor = color;
        maxDominatingFactor = ([color brightness] + [color saturation]);
    }
}

//standOutColor is now the stand out color

注意:我在 UIColor 上有一个用于计算亮度和饱和度的类别。

这是我为它制作的一个项目:

https://github.com/kdogisthebest/StandOutColor

于 2014-08-04T23:03:12.720 回答