如何将特定颜色转换为HSV / RGB标量值(通道4)?

时间:2019-04-30 12:50:37

标签: ios objective-c opencv colors

我正在尝试为我的绘画应用程序实现颜色更改功能。这是一些原始的和预期的结果。

原始图片: https://imgur.com/a/tSuqpIq

要求输出: https://imgur.com/a/HG3awEW

在这里,我们尝试了多种方法来实现此解决方案:

  1. 使用“ CIFilter”渲染图像
  2. 用公差值替换图像颜色的Pixel Wise。
  3. 填充颜色(不符合客户要求,不使用Alpha通道填充颜色)
  4. OpenCV。

我被困在可以找到特定颜色范围并替换为另一种颜色的地方。

我们编写了一个代码,用于在两者之间桥接代码后用OpenCV和目标C替换另一种颜色。

它们的灰度和其他方法正常工作(例如边缘检测)。但是,当用任何HSV和RGB值替换颜色时,它仅返回图像中的蓝色值。颜色也散布在椅子和其他物体上。

结果如下: https://imgur.com/7SUNuf4

-(UIImage *)ChangeColor:(UIImage *)processedImage col:(UIColor *)color { 
    UIColor *color1 = [self lighterColorForColor:color];
    UIColor *color2 = [self darkerColorForColor:color];
    UIColor *color3 = [self setColor:[arrForColor objectAtIndex:selectedColor] alpha:1.0];
   [color1 getRed:&r1 green:&g1 blue:&b1 alpha:&a1];
   [color2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2];
   [color3 getRed:&r3 green:&g3 blue:&b3 alpha:&a3];

    CGFloat r1, g1, b1, a1, r2, g2, b2, a2, r3, g3, b3, a3;
    [color1 getHue:&r1 saturation:&g1 brightness:&b1 alpha:nil];
    [color2 getHue:&r2 saturation:&g2 brightness:&b2 alpha:nil];
    [color3 getHue:&r3 saturation:&g3 brightness:&b3 alpha:nil];

    r1 = r1 * 255;
    r2 = r2 * 255;
    r3 = r3 * 255;

    g1 = g1 * 255;
    g2 = g2 * 255;
    g2 = g3 * 255;

    b1 = b1 * 255;
    b2 = b2 * 255;
    b3 = b3 * 255;

    cv::Mat img=[MMOpenCVHelper cvMatFromUIImage:processedImage];
    cv::Mat hsvImage = cv::cvarrToMat(cvCreateImage(img.size(),8, 3));
    cv::cvtColor(img, hsvImage, CV_BGR2HSV);

    std::vector<cv::Mat>channels;

    cv::split(hsvImage, channels);
    cv::Mat hue = channels[0];
    cv::Mat dest;
    cv::Mat temp= cv::cvarrToMat(cvCreateImage(img.size(), 8, 3));

    cv::inRange(hsvImage, cv::Scalar(10,10,10), cv::Scalar(20,20,20), dest);
    cv::merge(channels, temp);
    temp.setTo(cv::Scalar(50,50,50),dest);
    cv::split(temp, channels);
    cv::merge(channels, dest);
    cv::cvtColor(dest, hsvImage, CV_HSV2RGB);

    UIImage *grayeditImage=[MMOpenCVHelper UIImageFromCVMat:hsvImage];

    return grayeditImage;
}

- (UIColor *)lighterColorForColor:(UIColor *)c
{
    CGFloat r, g, b, a;
    if ([c getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MIN(r + 0.1, 1.0)
                               green:MIN(g + 0.1, 1.0)
                                blue:MIN(b + 0.1, 1.0)
                               alpha:a];
    return nil;
}

- (UIColor *)darkerColorForColor:(UIColor *)c
{
    CGFloat r, g, b, a;
    if ([c getRed:&r green:&g blue:&b alpha:&a])
        return [UIColor colorWithRed:MAX(r - 0.1, 0.0)
                               green:MAX(g - 0.1, 0.0)
                                blue:MAX(b - 0.1, 0.0)
                               alpha:a];
    return nil;
}

为什么即使我设置了不同的标量值,它也只返回蓝色?

0 个答案:

没有答案