Сканирование внешнего вида для UIImage (воспроизвести CIEdgeWork) - PullRequest
0 голосов
/ 14 апреля 2020

В настоящее время я пытаюсь воспроизвести на изображении отсканированные изображения.

Как выяснилось, много дней работы - CIFilter CIEdgeWork - лучший (но недостаточно хороший вариант).

исходное изображение

текущий результат

ожидаемое изображение

Доказательство того, что CIColorControls не очень хороший вариант

Было бы здорово для любой помощи.

1 Ответ

0 голосов
/ 15 апреля 2020

Было бы проще выполнить sh то, что вы хотите, удалив насыщенность изображения и увеличив его яркость и контрастность. Вам нужно поиграть с этими значениями, чтобы точно настроить результат в соответствии с вашими потребностями:

extension String {
    static let colorControls = "CIColorControls"
}

extension UIImage {
    var coreImage: CIImage? { CIImage(image: self) }
}

extension CIImage {

    var image: UIImage? { UIImage(ciImage: self) }

    func applying(brightness: Float, contrast: Float, saturation: Float) -> CIImage? {
        applyingFilter(.colorControls,
                       parameters: [kCIInputBrightnessKey: brightness,
                                    kCIInputContrastKey: contrast,
                                    kCIInputSaturationKey: saturation])
    }

    func renderedImage() -> UIImage? {
        guard let image = image else { return nil }
        return UIGraphicsImageRenderer(size: image.size,
                                       format: image.imageRendererFormat).image { _ in
            image.draw(in: CGRect(origin: .zero, size: image.size))
        }
    }
}

Тестирование игровой площадки

let image = UIImage(data: try! Data(contentsOf: URL(string: "https://i.stack.imgur.com/KEZE6.jpg")!))!
if let coreImage = image.coreImage,
    let filteredImage = coreImage.applying(brightness: 0.25, contrast: 1.75, saturation: 0) {
    // use your filtered core image here
    // filteredImage
    // or get an UIImage from it
    // filteredImage.image
    // if you need to convert it to JPEG or PNG you would need to render your core image 
    // filteredImage.renderedImage()

}

enter image description here

...