2016-07-20 2 views
1

나는 지정된 픽셀과 전체 이미지의 차이를 취하는 간단한 커널을 작성하고 있습니다. 아래 코드는 제가 가지고있는 코드입니다. 이것은 필터를 만드는 것입니다. 놀이터에서 놀 때 사용하는 것이 좋습니다.코어 이미지 커널 언어의 OpenGL 좌표계

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 

이제 위의 코드에서, 나는 우리가에 위치하는 픽셀의 차이 (1을 복용하고 있다는 지정한, 1) GaussIm의 이미지 (마치 일반적인 의미의 매트릭스)와 inputIm의 전체 이미지를 다루는 것처럼.

놀고 난 후에, 나는 커스텀 커널 언어가 OpenGL처럼 이미지를 다루는 것을 깨닫게되었다. 왼쪽 하단 모서리는 (0,0)에 매핑되고 오른쪽 상단 (1,1)은 픽셀 좌표가 0과 1 사이의 숫자가되도록합니다.이 문제는 내가 원하는 픽셀을 지정하려고한다는 것입니다. 차별화를 위해 사용하십시오.

커널 코드의 처음 5 행은 이미지의 각 픽셀 위치의 중심을 계산하여이를 완화하려고 시도합니다. OpenGL에서 이미지를 처리하는 방법을 고려할 때 이것이 올바른지 확신 할 수 없거나 더 좋은 방법이있을 수 있습니다. Input

내가 엑스 코드와 다음 얻을 : 나는 아래의 이미지와 함께, 위의 코드를 실행하면

OpenGL Output

또한 내가 MATLAB에서 같은 일을한다면, 나는 다음을 얻을 출력 : MATLAB Output

왜 MATLAB과 다른 출력이 나옵니까? 거의 사용자 정의 필터에서 얻은 것보다 더 어둡게 보이지만 동시에 같은 출력에 가깝습니다. 제 생각에 그것은 커스텀 커널이 픽셀들 사이의 차이를 가져 오는 방식 일 것입니다, 그러나 나는 정말로 무슨 일이 일어나는지 확신하지 못합니다.

답변

0

이미지가 계산되는 방식에 따라 클리핑이 발생했습니다. 이 작업은 컨텍스트가 아닌 놀이터에서 수행되었으므로 표시된 모든 항목이 [0,1]의 범위로 잘립니다. 이 문제를 해결하는 방법은 계산을 수행중인 CIContext가 옵션을 통해 계산시 부동 소수점 정밀도를 지원하는지 확인하는 것입니다.