swift抠图功能

swift抠图功能,第1张

1,要把一个人物或物体从背景中抠出来,通常有两种办法:

(1)使用CoreImage色域:适合纯色背景(或者背景色相对单一,色差不会太大),抠图精准

(2)使用openCv边缘检测:复杂背景情况也适用,默认抠图不够精确

如何使用Core Image抠图

对于纯色背景,可以直接把背景色给消除,这样剩下的便是主体了。要消除背景色,可以使用CIColorCube滤镜。

而CIColorCube滤镜需要一张cube映射表,这张表其实就是张颜色表(3D颜色查找表),把你想消除的颜色的alpha值设置为0,其他的颜色不变,Core Image将会把图像数据上的颜色映射为表中的颜色,以此来达到消除某种颜色的目的。

4,代表颜色值区域的HSV(Hue值)图

通过这个可以很方便的查看RGB颜色对应的HSV值。比如小猫背景都是蓝色的(只不过深浅不一),我们只需要把HSV在210到240这段颜色去处即可。

5,下面是样例效果图

为便于比较,我这边分别做了“只抠图”,以及“抠图并更换背景”两个功能。(真是毫无PS痕迹)

6,代码如下:

(1)首先创建Cube Map表

新建一个“C File”文件CubeMap.c,会Xcode会自动生成对应的头文件CubeMap.h,还有连接头文件(Bridging Header文件)。各文件里代码如下:

6,代码如下:

(1)首先创建Cube Map表

新建一个“C File”文件CubeMap.c,会Xcode会自动生成对应的头文件CubeMap.h,还有连接头文件(Bridging Header文件)。各文件里代码如下:

import UIKit

class ViewController: UIViewController{

@IBOutlet weak var imageView: UIImageView!

//图片原图

lazy var originalImage: UIImage = {

return UIImage(named: "cat.jpg")

}()!

lazy var context: CIContext = {

return CIContext(options: nil)

}()

override func viewDidLoad() {

super.viewDidLoad()

imageView.image = originalImage

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

}

//抠图

@IBAction func cutOut(sender: AnyObject) {

let cubeMap = createCubeMap(210,240)

let data = NSData(bytesNoCopy: cubeMap.data, length: Int(cubeMap.length),

freeWhenDone: true)

//消除某种颜色

let colorCubeFilter = CIFilter(name: "CIColorCube")!

colorCubeFilter.setValue(cubeMap.dimension, forKey: "inputCubeDimension")

colorCubeFilter.setValue(data, forKey: "inputCubeData")

colorCubeFilter.setValue(CIImage(image: originalImage), forKey: kCIInputImageKey)

let outputImage = colorCubeFilter.outputImage

let cgImage = context.createCGImage(outputImage!, fromRect: outputImage!.extent)

imageView.image = UIImage(CGImage: cgImage)

}

//抠图并合成

@IBAction func cutOutAndCompose(sender: AnyObject) {

let cubeMap = createCubeMap(210,240)

let data = NSData(bytesNoCopy: cubeMap.data, length: Int(cubeMap.length),

freeWhenDone: true)

//消除某种颜色

let colorCubeFilter = CIFilter(name: "CIColorCube")!

colorCubeFilter.setValue(cubeMap.dimension, forKey: "inputCubeDimension")

colorCubeFilter.setValue(data, forKey: "inputCubeData")

colorCubeFilter.setValue(CIImage(image: originalImage), forKey: kCIInputImageKey)

var outputImage = colorCubeFilter.outputImage

//与背景图合成

let sourceOverCompositingFilter = CIFilter(name: "CISourceOverCompositing")!

sourceOverCompositingFilter.setValue(outputImage, forKey: kCIInputImageKey)

sourceOverCompositingFilter.setValue(CIImage(image: UIImage(named: "bg.jpg")!),

forKey: kCIInputBackgroundImageKey)

outputImage = sourceOverCompositingFilter.outputImage

let cgImage = context.createCGImage(outputImage!, fromRect: outputImage!.extent)

imageView.image = UIImage(CGImage: cgImage)

}

//还原图片

@IBAction func resetImage(sender: AnyObject) {

self.imageView.image = originalImage

}

}

姓名:边颖超

学号:19021210974

利用MATLAB读取一张灰度和彩色图像,查看其对应的元素矩阵,将灰度图像与彩色图像显示出来,并获取该图像的高度、宽度等信息,最后将该图像另存为一幅图像。

利用imread函数读入灰度图片hurricane,并命名为Original Imagel;利用imshow函数可在提前设置的窗口中对读入图片进行显示,本实验设置2*2矩阵窗口,灰度图片显示在第一位置;利用size函数在命令行窗口可得到灰度图片高度、宽度信息。如图1程序所示。

利用imread函数读入RGB图片color,并命名为Original Image2;利用imshow函数可在提前设置的窗口中对读入图片进行显示,本部分设置figure1窗口,2*2矩阵窗口,彩色图片显示在第二位置;利用size函数在命令行窗口可得到彩色图片高度、宽度信息。如图1程序所示。

(2)另存图片有三种方式,可以分别利用print、imwrite、saves三个函数进行保存。三种函数有各自不同的调用格式,如下图程序注释。本实验将figure1中所有显示的图片全部另存为文件名test1格式png图片,保存位置为当前文件夹。如图2程序所示。

(3)最终结果


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12075414.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存