Внешний вид сканирования для UIImage (воспроизведение CIEdgeWork)

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

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

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

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

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

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

Был бы признателен за любую помощь.


person Artem Zinkov    schedule 14.04.2020    source источник
comment
Почему бы вам просто не увеличить контрастность изображения?   -  person Leo Dabus    schedule 14.04.2020
comment
Вы имеете в виду уменьшить? Это также уменьшает контрастность текста   -  person Artem Zinkov    schedule 15.04.2020
comment
stackoverflow.com/a/43011878/2303865   -  person Leo Dabus    schedule 15.04.2020
comment
Просто получите изображение в оттенках серого coreImage, используя расширение по ссылке выше.   -  person Leo Dabus    schedule 15.04.2020
comment
Уже работал с CIColorControl. Не достаточно хорош   -  person Artem Zinkov    schedule 15.04.2020
comment
это в 10 раз лучше, чем то, что вы опубликовали, проверьте мой пост ниже   -  person Leo Dabus    schedule 15.04.2020
comment
Я уже проверил это, прежде чем ответить. Добавлен результат использования CIColorControls, если вы мне не верите   -  person Artem Zinkov    schedule 15.04.2020
comment
Почему вы ожидаете, что серое вокруг технологий станет белым? Если вам нужно черно-белое изображение, очевидно, что серый цвет станет черным. Если вам нужно просто преобразовать цвет в оттенки серого, а затем в растровое изображение, я могу отредактировать свой пост, иначе вам придется копаться в управлении цветом dropbox.com/s/b93l79349cwj7av/bw%20image.jpg?dl=1   -  person Leo Dabus    schedule 15.04.2020
comment
Если вы не понимаете, я объясню. Ваш прямоугольник в левом верхнем углу при преобразовании в оттенки серого имеет много уровней оттенков серого в диапазоне от 0 в верхней левой части до 0,475. Сообщение об этом около 0,4. Текст Технология почти черный. Обратите внимание, что ваш рисунок при преобразовании в оттенки серого не черный, а в оттенках серого с тем же уровнем серого, что и прямоугольник около 0,4. Вы не можете ожидать, что код будет отличать серый цвет прямоугольника от серого цвета вашего рисунка.   -  person Leo Dabus    schedule 15.04.2020
comment
Да, я это понимаю, но ожидаемый результат в какой-то момент был достигнут. И мне интересно, как я могу добиться того же результата   -  person Artem Zinkov    schedule 16.04.2020


Ответы (2)


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

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()

}

введите здесь описание изображения

person Leo Dabus    schedule 14.04.2020

Для тех, кто борется после меня, ответ CIFilter CIConvolution7X7

Вы хотите ввести эти значения в вектор, который идет к вашему фильтру для ключа kCIInputWeightsKey.

    /**
     A = 12
     B = 16
     C = 12
     D = 4
     E = 4
     F = 1
     */

    // Matrix for pixel color priority
    let weightsArr: [CGFloat] = [
        A, A, B, B, B, A, A,
        A, B, C, C, C, B, A,
        B, C, D, E, D, C, B,
        B, C, E, F, E, C, B,
        B, C, D, E, D, C, B,
        A, B, C, C, C, B, A,
        A, A, B, B, B, A, A
    ]

    let inputWeights: CIVector = CIVector(values: weightsArr,
                                          count: weightsArr.count)

введите здесь описание изображения

person Artem Zinkov    schedule 09.06.2020