(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)最终结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)