核心图像内核语言的OpenGL坐标系

4

我正在编写一个简单的(至少我认为它应该是简单的)自定义内核,它可以获取指定像素与整个图像之间的差异。 以下是我拥有的代码,这只是制作滤镜。它很适合在游乐场上使用。

import UIKit
import CoreImage

let Flower = CIImage( image: UIImage(named: "flower.png")!)!

class Test: CIFilter
{
var inputImage1 : CIImage?
var inputImage2 : CIImage?

var kernel = CIKernel(string:
"kernel vec4 colorRemap(sampler inputIm, sampler GaussIm)      " +
"{                                                             " +
"vec4 size = samplerExtent(inputIm);                           " +
"float row = 1.0;                                              " + 
"float column = 1.0;                                           " + 
"float pixelx = (column - 1.0)/(size.w - 1.0)+1.0/(2.0*size.z);" +
"float pixely = (size.z - row)/(size.z - 1.0)-1.0/(2.0*size.w);" +
"vec3 g0 =sample(GaussIm,vec2(pixelx,pixely)).rgb;             " +
"vec3 current = sample(inputIm,samplerCoord(inputIm)).rgb;     " +
"vec3 diff =(current - g0);                                    " +
"return vec4(diff,1.0);                                        " +
"}                                                             "
)
    var extentFunction: (CGRect, CGRect) -> CGRect =
    { (a: CGRect, b: CGRect) in return CGRectZero }
    override var outputImage: CIImage!
{
    if let inputImage1 = inputImage1,
        inputImage2 = inputImage2,
        kernel = kernel
    {
        let extent = inputImage1.extent
        let arguments = [inputImage1,inputImage2]

        return kernel.applyWithExtent(extent,
                                      roiCallback:
            { (index, rect) in
                return rect

            },
            arguments: arguments)

    }
    return nil
}
}

使用过滤器,您可以执行以下操作:
let filter = Test()
filter.inputImage1 = Flower
filter.inputImage2 = Flower
let output = filter.outputImage

现在,在上面的代码中,我已经指定了我们正在取GaussIm中位于(1,1)的像素之间的差异,就好像我们将图像视为矩阵(通常意义下),并且整个输入图像。玩了一番之后,我意识到自定义内核语言有点像OpenGL对待图像一样。左下角映射到(0,0),右上角为(1,1),因此像素坐标是介于0和1之间的数字。这样做的问题是我想指定要使用哪个像素来取差异。内核代码的前5行试图通过计算图像中每个像素位置的中心来缓解这个问题。考虑到OpenGL如何处理它的图像,我不确定这是否正确,或者可能有更好的方法。如果我使用以下图像运行此代码:Input,我会得到以下XCode输出:OpenGL Output。此外,如果我在MATLAB中执行相同的操作,我会得到以下输出:MATLAB Output。为什么我得到的输出与MATLAB不同?它似乎比我从自定义滤镜中得到的略微暗一些,但它们同时接近相同的输出。我的想法是这必须是自定义内核在像素之间取差异的方式,但我不确定发生了什么。
1个回答

0

我最终弄明白了——图像被剪切的原因是由于计算图像的方式的本质。这项工作是在一个游乐场中完成的,而不是在上下文中完成的,因此任何显示的内容都被剪切到[0,1]的范围内。解决这个问题的方法是确保你用选项支持浮点精度进行计算的CIContext上。


嘿,戴夫,我们仍然卡在这个问题上……我代表我的团队说话。我们是一家位于特拉维夫的小型初创公司,正在开发使用自定义AVVideoCompositing来合成最终视频的高级视频编辑应用程序。我们遇到了一些有趣但具有挑战性的问题,涉及组合器内CIImage和OpenGL之间的转换。如果您感兴趣的话,我们想请您提供2-3小时的咨询服务(当然是付费的),看看您是否能够帮助我们或指导我们走向正确的方向。这是您感兴趣的事情吗? - Roi Mulia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接