【问题标题】:how to find particular color in an uiimage and change that color如何在 uiimage 中找到特定颜色并更改该颜色
【发布时间】:2017-01-13 22:19:03
【问题描述】:

我想在图像中找到特定的颜色,例如我有一个具有多种颜色的图像。通过分配红色参数,我想更改除红色像素之外的其他颜色像素。请看下面的图片。在上面更新的图像中,仅突出显示了模糊颜色,所有其他颜色都已更改。

更新图片

【问题讨论】:

标签: ios objective-c core-image


【解决方案1】:

好的,所以我很好奇实现这个反向色度键有多难,事实证明,考虑到example from Apple,这很容易!

// Allocate memory
const unsigned int size = 32;
float *cubeData = (float *)malloc (size * size * size * sizeof (float) * 4);
float rgb[3], *c = cubeData;
CGFloat hue = CGFLOAT_MAX;

CGFloat minHueAngle = 210;
CGFloat maxHueAngle = 240;

// Populate cube with a simple gradient going from 0 to 1
for (int z = 0; z < size; z++){
    rgb[2] = ((double)z)/(size-1); // Blue value
    for (int y = 0; y < size; y++){
        rgb[1] = ((double)y)/(size-1); // Green value
        for (int x = 0; x < size; x ++){
            rgb[0] = ((double)x)/(size-1); // Red value
            // Convert RGB to HSV
            // You can find publicly available rgbToHSV functions on the Internet
            UIColor *color = [UIColor colorWithRed:rgb[0] green:rgb[1] blue:rgb[2] alpha:1];
            [color getHue:&hue saturation:nil brightness:nil alpha:nil];
            hue *= 360;

            // Use the hue value to determine which to make transparent
            // The minimum and maximum hue angle depends on
            // the color you want to remove
            float alpha = (hue > minHueAngle && hue < maxHueAngle) ? 1.0f: 0.0f;
            // Calculate premultiplied alpha values for the cube
            c[0] = rgb[0] * alpha;
            c[1] = rgb[1] * alpha;
            c[2] = rgb[2] * alpha;
            c[3] = alpha;
            c += 4; // advance our pointer into memory for the next color value
        }
    }
}
// Create memory with the cube data
NSData *data = [NSData dataWithBytesNoCopy:cubeData
                                    length:(size * size * size * sizeof (float) * 4)
                              freeWhenDone:YES];
CIFilter *colorCube = [CIFilter filterWithName:@"CIColorCube"];
[colorCube setValue:@(size) forKey:@"inputCubeDimension"];
[colorCube setValue:data forKey:@"inputCubeData"];

UIImage *originalImage = [UIImage imageNamed:@"yourImageName"];
CIImage *ciImage = [CIImage imageWithCGImage:originalImage.CGImage];
[colorCube setValue:ciImage forKey:kCIInputImageKey];


UIImage *result = [UIImage imageWithCIImage:[colorCube outputImage]];

这导致了这张图片,来自您的示例图片:

我不得不说它看起来相当不错,因为我只修改了一两分钟的值。当然,要获得您想要的最终结果,您需要再使用两个过滤器 - 即 CIPhotoEffectMono 和 CISourceOverCompositing 首先将原始图像设为黑白,然后将 CubeMap 过滤器的结果叠加在黑色上& 白色图像。

【讨论】:

  • 你看过 GPUImage 库吗? github.com/BradLarson/GPUImage2你可以在那里找到大多数你需要的图像处理过滤器
  • 非常感谢@Losiowaty 它为我节省了很多。我是 IOS 新手,所以请你帮我找出红色、绿色、紫色、黄色和青色的最小和最大色调值.
  • 嗯,这与 iOS 无关;)我从维基百科获得了蓝色(240)的值,并尝试了一点最小值/最大值,直到我得到满意的结果;)
  • 当我特别提到一种颜色它工作得很好但是当我给它提供 RGB 颜色时它不能正常工作时,我遇到了一个问题。你能帮我解决这个@Losiowaty
  • 好吧,使用任意颜色肯定会变得更棘手 - 您需要首先提取它们的色调、饱和度和亮度,将它们用作基线,然后将其中的每一个与提取的相应值进行比较有一些边距的循环。对此没有简单的答案,至少我想不出一个。添加滑块来控制色相/亮度/饱和度的最小值/最大值并实时试验结果可能是个好主意。
猜你喜欢
  • 2018-08-20
  • 2017-07-13
  • 1970-01-01
  • 2012-06-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多