首页 > 其他分享 >图像处理的实现与应用(Swift 版)

图像处理的实现与应用(Swift 版)

时间:2024-10-24 17:31:15浏览次数:4  
标签:cgImage context height width 图像处理 let 应用 UIImage Swift

图像处理在现代技术中扮演着重要的角色,广泛应用于计算机视觉、图像分析和机器学习等领域。本文将介绍一种简单的图像处理方法,主要包括灰度转换、去除边框、提取有效区域和图像分割,并提供相应的 Swift 代码示例。

灰度转换
灰度转换是将彩色图像转换为灰度图像的技术,目的是减少图像的复杂性。在 Swift 中,我们可以使用 Core Graphics 来实现灰度转换:

swift

import UIKit

func convertToGray(image: UIImage) -> UIImage? {
let size = image.size
UIGraphicsBeginImageContext(size)

let context = UIGraphicsGetCurrentContext()
context?.translateBy(x: 0, y: size.height)
context?.scaleBy(x: 1.0, y: -1.0)

context?.setBlendMode(.copy)
context?.draw(image.cgImage!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

context?.setBlendMode(.sourceIn)
context?.setFillColor(UIColor.gray.cgColor)
context?.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))

let grayImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

return grayImage

}
去除图像边框
去除图像的边框可以通过遍历图像的每一行和每一列来实现。以下是相应的代码:

swift

func clearBorders(image: UIImage, borderWidth: Int) -> UIImage? {
guard let cgImage = image.cgImage else { return nil }
let width = cgImage.width
let height = cgImage.height
let colorSpace = CGColorSpaceCreateDeviceRGB()

guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else { return nil }

context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))

let data = context.data?.assumingMemoryBound(to: UInt8.self)

for y in 0..<height {
    for x in 0..<width {
        if x < borderWidth || y < borderWidth || x >= width - borderWidth || y >= height - borderWidth {
            let pixelIndex = (y * width + x) * 4
            data?[pixelIndex] = 255     // Red
            data?[pixelIndex + 1] = 255 // Green
            data?[pixelIndex + 2] = 255 // Blue
        }
    }
}

let newCGImage = context.makeImage()
return newCGImage != nil ? UIImage(cgImage: newCGImage!) : nil

}
提取有效区域
有效区域提取是图像分析中的关键步骤。我们可以使用以下代码来提取有效区域:

swift

func extractValidRegion(image: UIImage, grayThreshold: UInt8) -> UIImage? {
guard let cgImage = image.cgImage else { return nil }
let width = cgImage.width
let height = cgImage.height
let colorSpace = CGColorSpaceCreateDeviceRGB()

guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else { return nil }

context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))

let data = context.data?.assumingMemoryBound(to: UInt8.self)

var minX = width, minY = height
var maxX = 0, maxY = 0

for y in 0..<height {
    for x in 0..<width {
        let pixelIndex = (y * width + x) * 4
        let grayValue = data?[pixelIndex] ?? 255
        
        if grayValue < grayThreshold {
            if minX > x { minX = x }
            if minY > y { minY = y }
            if maxX < x { maxX = x }
            if maxY < y { maxY = y }
        }
    }
}

let validRegion = context.makeImage()?.cropping(to: CGRect(x: minX, y: minY, width: maxX - minX + 1, height: maxY - minY + 1))
return validRegion != nil ? UIImage(cgImage: validRegion!) : nil

}更多内容联系1436423940
图像分割
图像分割可以将图像划分为多个小块。以下是实现这一功能的代码:

swift

func splitImage(image: UIImage, rows: Int, cols: Int) -> [UIImage] {
guard let cgImage = image.cgImage else { return [] }
let width = cgImage.width
let height = cgImage.height
var splitImages: [UIImage] = []

let pieceWidth = width / cols
let pieceHeight = height / rows

for i in 0..<rows {
    for j in 0..<cols {
        let rect = CGRect(x: j * pieceWidth, y: i * pieceHeight, width: pieceWidth, height: pieceHeight)
        if let pieceCGImage = cgImage.cropping(to: rect) {
            splitImages.append(UIImage(cgImage: pieceCGImage))
        }
    }
}

return splitImages

}
生成二进制编码
最后,将灰度图像转换为二进制字符串:

swift

func generateBinaryCode(image: UIImage, grayThreshold: UInt8) -> String {
guard let cgImage = image.cgImage else { return "" }
let width = cgImage.width
let height = cgImage.height
let colorSpace = CGColorSpaceCreateDeviceRGB()

guard let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else { return "" }

context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))

let data = context.data?.assumingMemoryBound(to: UInt8.self)
var binaryCode = ""

for y in 0..<height {
    for x in 0..<width {
        let pixelIndex = (y * width + x) * 4
        let grayValue = data?[pixelIndex] ?? 255
        
        binaryCode.append(grayValue < grayThreshold ? "1" : "0")
    }
}
return binaryCode

}

标签:cgImage,context,height,width,图像处理,let,应用,UIImage,Swift
From: https://www.cnblogs.com/ocr1/p/18500031

相关文章

  • 过路车辆识别视频分析服务器智慧园区/智慧城市算法简介及应用
    视频分析服务器是一款集成了软硬件的一体化解决方案,它适用于城市管理部门、环境卫生、教育领域、水利工程、工业园区以及住宅小区等多个行业和场景。这款智能化的一体机设备为用户提供了高清视频监控的接入能力、智能视频分析、告警功能以及数据资源的共享服务。一、概要1、功能......
  • 实验3 C语言函数应用编程
    实验一#include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数:%d,等级:%c\n\n",score,grade);......
  • 基于 Python 的机器学习模型部署到 Flask Web 应用:从训练到部署的完整指南
    目录引言技术栈步骤一:数据预处理步骤二:训练机器学习模型步骤三:创建FlaskWeb应用步骤四:测试Web应用步骤五:模型的保存与加载保存模型加载模型并在Flask中使用步骤六:Web应用的安全性考量示例:简单的输入验证示例:自定义错误处理示例:使用Flask-JWT-Extended进......
  • 如何在供应链行业中应用区块链
    区块链技术在供应链行业的应用可以带来多方面的改进,包括提高透明度、增强安全性、简化流程、减少成本等。以下是几个主要的应用场景和具体实施方式:1.产品溯源应用场景:消费者和监管机构要求了解产品的来源和历史,确保产品质量和安全。实施方式:通过在区块链上记录每个生产环节的......
  • 文字识别接口应用场景解析-身份证识别、发票识别API、车牌识别
    在快节奏的工作与生活环境中,如何提高企业工作效率、提升用户体验成为了人们追求的共同目标。针对市场发展需求,一种将任意场景图片中的文字转换为可编辑文本的文字识别技术出现在大众视野。翔云人工智能开放平台通过不断的技术创新,基于深度学习算法与自主ocr核心技术,提供了......
  • PFC离散元数值模拟仿真技术与应用
    随着计算能力的提高和算法的优化,离散元仿真技术得到了快速发展,并在学术界产生了大量研究成果。在PFC离散元计算中无需给定材料的宏观本构关系和对应的参数,这些传统的参数和力学特性在程序中可以自动得到。据调查,运用PFC离散元仿真技术工具近几年发表的论文主要集中在以下几个方......
  • 基于Fluent和深度学习算法驱动的流体力学计算与应用
    机器学习与流体力学入门一、流体力学基础理论与编程实战1、流体力学的发展概述2、不可压缩流体力学的基本方程3、偏微分方程数值求解介绍4、傅里叶变换和流体的尺度分析5、伪谱法求解不可压缩流体力学方程案例实践:1、Matlab编程实现有限差分(案例数据与代码提供给学员)2......
  • 基于OpenFOAM和深度学习驱动的流体力学计算与应用
    在深度学习与流体力学深度融合的背景下,科研边界不断拓展,创新成果层出不穷。从物理模型融合到复杂流动模拟,从数据驱动研究到流场智能分析,深度学习正以前所未有的力量重塑流体力学领域。近期在Nature和Science杂志上发表的深度学习驱动的流体力学方面的论文主要集中以下几个方面:......
  • Nuxt.js 应用中的 builder:watch 事件钩子详解
    title:Nuxt.js应用中的builder:watch事件钩子详解date:2024/10/24updated:2024/10/24author:cmdragonexcerpt:builder:watch是Nuxt.js中的一个生命周期钩子,在开发环境的构建过程期间被调用。它允许开发者在监视到项目中的文件或目录发生变化时,执行特定的操作。这......
  • 应用层协议 序列化
    应用层协议概述定义与作用应用层协议是计算机网络体系结构中最顶层的协议,它定义了运行在不同端系统上的应用程序进程如何传递报文1。这些协议不仅规定了报文的类型、语法和字段语义,还明确了进程发送报文的时间和方式1。通过标准化数据交换格式和流程,应用层协议实现了跨系......