swift: Какой фильтр выбрать, если я хочу нормализовать изображение? - PullRequest
0 голосов
/ 30 октября 2018

Как и в этой теме, я использую swift для прогнозирования модели, и кто-то предлагает мне использовать CoreImage для вычитания среднего значения входного изображения, но, похоже, я не могу сделать это только с одним фильтром. Итак, какой фильтр выбрать, если я хочу нормализовать изображение?

Пока что я пытался сделать это без CoreImage

let oriimage = self.convert(cmage: ciimage)
let uimean:UIImage = UIImage(color: oriimage.averageColor(), size: CGSize(width: oriimage.size.width, height:  oriimage.size.width))!
let cimean:CIImage = CIImage(image:uimean)!

ciimage.composited(over: cimean)
let image = self.convert(cmage: ciimage)

Однако это больше похоже на объединение двух изображений, но вычитание.

1 Ответ

0 голосов
/ 30 октября 2018

Я осматриваю фильтр инфраструктуры CoreImage и обнаруживаю, что CIColorMatrix может работать.

extension UIImage {
    func colorized(with color: UIColor) -> UIImage? {
        guard
            let ciimage = CIImage(image: self),
            let colorMatrix = CIFilter(name: "CIColorMatrix")
            else { return nil }
        var r: CGFloat = 1, g: CGFloat = 1, b: CGFloat = 1, a: CGFloat = 1
        color.getRed(&r, green: &g, blue: &b, alpha: &a)
        colorMatrix.setDefaults()
        colorMatrix.setValue(ciimage, forKey: "inputImage")
        colorMatrix.setValue(CIVector(x: 1, y: 0, z: 0, w: 0), forKey: "inputRVector")
        colorMatrix.setValue(CIVector(x: 0, y: 1, z: 0, w: 0), forKey: "inputGVector")
        colorMatrix.setValue(CIVector(x: 0, y: 0, z: 1, w: 0), forKey: "inputBVector")
        colorMatrix.setValue(CIVector(x: 0, y: 0, z: 0, w: 1), forKey: "inputAVector")
        colorMatrix.setValue(CIVector(x: -r, y: -g, z: -b, w: 0), forKey: "inputBiasVector")
        if let ciimage = colorMatrix.outputImage {
            return UIImage(ciImage: ciimage)
        }
        return nil
    }
}

let image = oriimage.colorized(with: color) ?? oriimage
let screensize:CGSize = CGSize(width: 720, height: 1280)
var face = image.cropped(boundingBox: facerect)
var left = image.cropped(boundingBox: leftrect)
var right = image.cropped(boundingBox: rightrect)


let col = 64,row = 64,c=3
face = face.resizeImageWith(newSize: CGSize(width:col,height:row))

Однако другая проблема возникает в последней строке. Результат возвращает ноль и останавливает приложение, но когда я отображаю изображение, изображение хорошее.

...