swift抠图功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift抠图功能相关的知识,希望对你有一定的参考价值。
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
参考技术A 如何使用swift抠图
对于纯色背景,可以直接把背景色给消除,这样剩下的便是主体了。要消除背景色,可以使用CIColorCube滤镜。
而CIColorCube滤镜需要一张cube映射表,这张表其实就是张颜色表(3D颜色查找表),把你想消除的颜色的alpha值设置为0,其他的颜色不变,Core Image将会把图像数据上的颜色映射为表中的颜色,以此来达到消除某种颜色的目的。
4,代表颜色值区域的HSV(Hue值)图
通过这个可以很方便的查看RGB颜色对应的HSV值。比如小猫背景都是蓝色的(只不过深浅不一),我们只需要把HSV在210到240这段颜色去处即可。
5,下面是样例效果图
为便于比较,我这边分别做了“只抠图”,以及“抠图并更换背景”两个功能。(真是毫无PS痕迹) 参考技术B 如何使用swift抠图
对于纯色背景,可以直接把背景色给消除,这样剩下的便是主体了。要消除背景色,可以使用CIColorCube滤镜。
而CIColorCube滤镜需要一张cube映射表,这张表其实就是张颜色表(3D颜色查找表),把你想消除的颜色的alpha值设置为0,其他的颜色不变,Core Image将会把图像数据上的颜色映射为表中的颜色,以此来达到消除某种颜色的目的。
4,代表颜色值区域的HSV(Hue值)图
通过这个可以很方便的查看RGB颜色对应的HSV值。比如小猫背景都是蓝色的(只不过深浅不一),我们只需要把HSV在210到240这段颜色去处即可。
5,下面是样例效果图
为便于比较,我这边分别做了“只抠图”,以及“抠图并更换背景”两个功能。(真是毫无PS痕迹) 参考技术C 1,要把一个人物或物体从背景中抠出来,通常有两种办法:
(1)使用CoreImage色域:适合纯色背景(或者背景色相对单一,色差不会太大),抠图精准
(2)使用openCv边缘检测:复杂背景情况也适用,默认抠图不够精确
2,下面使用第一种方案把下面的小猫抠出来,放置到雪地背景上。


3,如何使用Core Image抠图
对于纯色背景,可以直接把背景色给消除,这样剩下的便是主体了。要消除背景色,可以使用CIColorCube滤镜。
而CIColorCube滤镜需要一张cube映射表,这张表其实就是张颜色表(3D颜色查找表),把你想消除的颜色的alpha值设置为0,其他的颜色不变,Core Image将会把图像数据上的颜色映射为表中的颜色,以此来达到消除某种颜色的目的。
4,代表颜色值区域的HSV(Hue值)图

通过这个可以很方便的查看RGB颜色对应的HSV值。比如小猫背景都是蓝色的(只不过深浅不一),我们只需要把HSV在210到240这段颜色去处即可。 参考技术D swift抠图功能?
答:1,要把一个人物或物体从背景中抠出来,通常有两种办法:
(1)使用CoreImage色域:适合纯色背景(或者背景色相对单一,色差不会太大),抠图精准
(2)使用openCv边缘检测:复杂背景情况也适用,默认抠图不够精确
2,下面使用第一种方案把下面的小猫抠出来,放置到雪地背景上;
回答完毕!
我的OpenGL学习进阶之旅 OpenGL ES 实现 绿幕抠图 以及 替换绿幕背景的功能
一、绿幕抠图
“近来,我们总是不经意间看到一些自媒体公众号,影评人在谈到某部上映的影视剧制作如何稀烂,演员如何不敬业时总会用到"抠图"这个词。似乎"抠图"已经成为了影视制作这个行业的贬义词,那么这到底是个什么技术了?”
其实在今天他们口中所谓的"**抠图"**在影视制作行业有个专业名词叫"绿幕抠像"。指的是当演员无法到达拍摄现场时,或者无法做出情节需要的背景时,演员在摄影棚内用绿幕独自拍摄,然后再用抠像的方式与外景或者特效场景合成。原理与PS发生的“悬浮照”相似,只不外照片中的人像,换成了视频中连贯的人物表演。
那么有的人就会好奇为什么要用绿幕,红幕,黑幕,白幕不行吗?其实这个是跟人体颜色有关,人的肤色,发色,通常服饰等与绿色色差是最大的,通常抠像是为了将人物抠出来,所以抠像时用绿幕可以得到最好的抠图效果。其实在电影的胶片时代运用的抠像技术流行蓝幕抠像,蓝色和绿色是比较接近的颜色,因为在室外拍摄时,天空,水面反射光等自然界的光线会照射到人物身上形成一些蓝色像素,所以现在室外拍摄需要用到抠像时一般都以绿幕为主。当然,像拍那些惨绿惨绿的幽灵,绿巨人之类的特殊题材,用绿幕肯定是不合适的,这时候就要用到绿色的补色黄色了,总之,用什么样色的幕布去抠像是要根据具体情况决定了……
以上是关于swift抠图功能的主要内容,如果未能解决你的问题,请参考以下文章
我的OpenGL学习进阶之旅 OpenGL ES 实现 绿幕抠图 以及 替换绿幕背景的功能