나는 지정된 픽셀과 전체 이미지의 차이를 취하는 간단한 커널을 작성하고 있습니다. 아래 코드는 제가 가지고있는 코드입니다. 이것은 필터를 만드는 것입니다. 놀이터에서 놀 때 사용하는 것이 좋습니다.코어 이미지 커널 언어의 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에서 이미지를 처리하는 방법을 고려할 때 이것이 올바른지 확신 할 수 없거나 더 좋은 방법이있을 수 있습니다.
내가 엑스 코드와 다음 얻을 : 나는 아래의 이미지와 함께, 위의 코드를 실행하면
또한 내가 MATLAB에서 같은 일을한다면, 나는 다음을 얻을 출력 :
왜 MATLAB과 다른 출력이 나옵니까? 거의 사용자 정의 필터에서 얻은 것보다 더 어둡게 보이지만 동시에 같은 출력에 가깝습니다. 제 생각에 그것은 커스텀 커널이 픽셀들 사이의 차이를 가져 오는 방식 일 것입니다, 그러나 나는 정말로 무슨 일이 일어나는지 확신하지 못합니다.