【问题标题】:Scan appearance for UIImage (reproduce CIEdgeWork)UIImage 的扫描外观(复制 CIEdgeWork)
【发布时间】:2020-07-27 16:15:48
【问题描述】:

我目前正在努力在图像上重现扫描外观

正如发现投入很多天的工作 - CIFilter CIEdgeWork - 是最好的(但不足以满足我的需要)选项。

original image

current result

expected image

Proof that CIColorControls isn't good option

如果有任何帮助,将不胜感激。

【问题讨论】:

  • 为什么不简单地增加图像对比度?
  • 你的意思是减少?它也减少了文本的对比度
  • 只需使用上面链接中的扩展名获取您的图像 coreImage 灰度
  • 已经使用 CIColorControl。不够好

标签: ios swift core-image cifilter


【解决方案1】:

消除图像饱和度并增加其亮度和对比度会更容易完成您想要的操作。您需要使用这些值来微调结果以满足您的需求:

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

}

【讨论】:

    【解决方案2】:

    对于那些在我之后苦苦挣扎的人,答案是 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)
    

    enter image description here

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多