Выберите часть изображения с заданным цветом

Я хотел бы реализовать функцию, которая позволяет пользователю выбрать данный цвет из изображения и заменить его прозрачным цветом. В идеале это будет работать аналогично Pixelmator, https://www.youtube.com/watch?v=taXGaQC0JBg где пользователь может выбирать цвета и видеть, какие части изображения в настоящее время выбраны, и ползунок, который можно использовать для выбора допуска цвета.

Мой основной подозреваемый для замены цветов - функция CGImageCreateWithMaskingColors(). Возможно, CIColorCube мог бы сделать эту работу. Я не уверен, как приступить к визуализации выбора цветов. Любые советы будут приветствоваться! спасибо, Януш

РЕДАКТИРОВАТЬ: я двигаюсь очень медленно, но я добился определенного прогресса. Я использую функцию imageCreateWithMaskingColors для извлечения нежелательных цветов:

    func imageWithMaskingColors(){
        //get uiimage
        let image:CGImageRef = self.inputImage.image!.CGImage
        let maskingColors :[CGFloat] = [0,200,0,255,0,255]


        let newciimage = CGImageCreateWithMaskingColors(image,maskingColors)

        let newImage = UIImage(CGImage: newciimage)
        self.outputImage.image = newImage
        let w = CGFloat(CGImageGetWidth(newciimage))
        let h = CGFloat(CGImageGetHeight(newciimage))
        let size = CGSizeMake(w,h)

        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        let context = UIGraphicsGetCurrentContext();

        newImage?.drawInRect(CGRectMake(0, 0, w, h))

        let result  = UIGraphicsGetImageFromCurrentImageContext();
        self.inputImage1 = result.CGImage
        UIGraphicsEndImageContext();


    }

Извлечение цветов

На следующем шаге я применяю CIFilter CISourceOutCompositing, чтобы получить выделенную область, которая была удалена на последнем шаге: @IBAction func blendMode(){

    let context = CIContext(options: nil)
    let inputImage:CIImage = CIImage(CGImage:self.inputImage1)
    var filter = CIFilter(name: "CISourceOutCompositing")
    println(inputImage.debugDescription)

    //mix it with black
    let fileURL = NSBundle.mainBundle().URLForResource("black", withExtension: "jpg")
    var backgroundImage = CIImage(contentsOfURL: fileURL)
    filter.setValue(inputImage, forKey: kCIInputBackgroundImageKey)
     filter.setValue(backgroundImage, forKey: kCIInputImageKey)
    println(backgroundImage.debugDescription)
    let outputImage = filter.outputImage
    println(outputImage.debugDescription)
    let cgimg = context.createCGImage(outputImage, fromRect: outputImage.extent())

    blendImage1 = cgimg

    let newImage = UIImage(CGImage: cgimg)

    self.outputImage.image = newImage

}

Выбранная областьНа следующем этапе я хотел бы добавить пунктирную линию обводки к границам и удалить цвет заливки выбранного изображения (черный тигр).

Я использовал GPUImage CannyEdgeDetectionFilter для изображения, но он не дал мне удовлетворительных результатов (черное изображение)

let gpaPicture = GPUImagePicture(CGImage: blendImage1)
        let canny = GPUImageCannyEdgeDetectionFilter()
        //canny.upperThreshold = CGFloat(1125)
        canny.lowerThreshold = CGFloat(1)
        gpaPicture.addTarget(canny)
        canny.useNextFrameForImageCapture()
        gpaPicture.processImage()
        let gpuResult = canny.imageByFilteringImage(UIImage(CGImage:blendImage1))

0 ответов

Другие вопросы по тегам