菜鸟教程小白 发表于 2022-12-11 17:02:22

ios - Core Image Kernel Language 的 OpenGL 坐标系


                                            <p><p>我正在编写一个简单的(至少我认为它会很简单)自定义内核,它获取指定像素和整个图像的差异。
下面是我的代码,这只是过滤器。很适合在 Playground 玩耍。</p>

<pre><code>import UIKit
import CoreImage

let Flower = CIImage( image: UIImage(named: &#34;flower.png&#34;)!)!

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

var kernel = CIKernel(string:
&#34;kernel vec4 colorRemap(sampler inputIm, sampler GaussIm)      &#34; +
&#34;{                                                             &#34; +
&#34;vec4 size = samplerExtent(inputIm);                           &#34; +
&#34;float row = 1.0;                                              &#34; +
&#34;float column = 1.0;                                           &#34; +
&#34;float pixelx = (column - 1.0)/(size.w - 1.0)+1.0/(2.0*size.z);&#34; +
&#34;float pixely = (size.z - row)/(size.z - 1.0)-1.0/(2.0*size.w);&#34; +
&#34;vec3 g0 =sample(GaussIm,vec2(pixelx,pixely)).rgb;             &#34; +
&#34;vec3 current = sample(inputIm,samplerCoord(inputIm)).rgb;   &#34; +
&#34;vec3 diff =(current - g0);                                    &#34; +
&#34;return vec4(diff,1.0);                                        &#34; +
&#34;}                                                             &#34;
)
    var extentFunction: (CGRect, CGRect) -&gt; 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 =

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

            },
            arguments: arguments)

    }
    return nil
}
}
</code></pre>

<p>要使用过滤器,您可以执行以下操作</p>

<pre><code>let filter = Test()
filter.inputImage1 = Flower
filter.inputImage2 = Flower
let output = filter.outputImage
</code></pre>

<p>现在,在上面的代码中,我已经指定我们正在获取位于 GaussIm (1,1) 处的像素之间的差异,就好像我们将图像视为一个矩阵(通常意义上的) ,以及 inputIm 的整个图像。</p>

<p>玩过之后,我开始意识到自定义内核语言处理图像有点像 OpenGL。左下角映射到 (0,0),右上角映射到 (1,1),因此像素坐标是 0 到 1 之间的数字。问题是我想指定我想要的任何像素用来取差价。 </p>

<p>内核代码的前 5 行试图通过计算图像中每个像素位置的中心来缓解这种情况。考虑到 OpenGL 如何处理它的图像,我不确定这是否正确,或者也许有更好的方法。</p>

<p>如果我在上面运行此代码,则使用下图:
<a href="/image/TzXOY.png" rel="noreferrer noopener nofollow"><img src="/image/TzXOY.png" alt="Input"/></a> </p>

<p>我通过 XCode 得到以下信息:
<a href="/image/kP3p5.png" rel="noreferrer noopener nofollow"><img src="/image/kP3p5.png" alt="OpenGL Output"/></a> </p>

<p>此外,如果我在 MATLAB 中做同样的事情,我会得到以下输出:
<a href="/image/UNRZ8.png" rel="noreferrer noopener nofollow"><img src="/image/UNRZ8.png" alt="MATLAB Output"/></a> </p>

<p>为什么我得到的输出与在 MATLAB 中不同?它似乎比我从自定义过滤器中得到的要暗一点,但它们同时接近相同的输出。我的想法是它一定是自定义内核在像素之间获取差异的方式,但我不确定发生了什么。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我最终弄明白了——剪辑的原因是由于图像计算方式的性质。这项工作是在 Playground 上完成的,而不是在上下文中,所以显示的任何内容都被裁剪到 的范围内。解决此问题的方法是通过选项确保您正在进行计算的 CIContext 在其计算中支持浮点精度。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Core Image Kernel Language 的 OpenGL 坐标系,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/38491412/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/38491412/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Core Image Kernel Language 的 OpenGL 坐标系