2013-01-22 1 views

답변

7

여기서 찾고있는 흐림 효과를 양면 흐림이라고합니다. 표준 가우시안 흐림 효과와는 달리 주변 픽셀 색상은 중앙 픽셀 색상과 중앙 픽셀과의 유사도를 기준으로 평균화됩니다. 이렇게하면 오브젝트의 내부 영역이 흐려 지지만 예리한 윤곽이 유지됩니다.

내 오픈 소스 GPUImage 프레임 워크에는 GPUImageBilateralFilter라는 필터가 있습니다. (1.0 blurSize 1.6의 distanceNormalizationFactor 사용) 이미지에 적용 할 때 그의 출력 :이 내 결과와 대상 사이에 약간의 차이가 있지만 그 인해 아마

Filtered orange using a bilateral blur

내가 사용하는 구체적인 가중치. 여기에서 매개 변수를 조정하면 위의 내용과 더 가까워 질 수 있습니다.

을 OpenCV는 양자 흐림 필터를 가지고 있으며,이 프레임 워크의 외부를 사용하고 싶은 경우 당신은 나의 조각 쉐이더 소스 코드를 가지고 자신의 OpenGL ES 구현을 구성하려면이 옵션을 사용할 수 있습니다

uniform sampler2D inputImageTexture; 

const lowp int GAUSSIAN_SAMPLES = 9; 

varying highp vec2 textureCoordinate; 
varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES]; 

uniform mediump float distanceNormalizationFactor; 

void main() 
{ 
    lowp vec4 centralColor; 
    lowp float gaussianWeightTotal; 
    lowp vec4 sum; 
    lowp vec4 sampleColor; 
    lowp float distanceFromCentralColor; 
    lowp float gaussianWeight; 

    centralColor = texture2D(inputImageTexture, blurCoordinates[4]); 
    gaussianWeightTotal = 0.18; 
    sum = centralColor * 0.18; 

    sampleColor = texture2D(inputImageTexture, blurCoordinates[0]); 
    distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); 
    gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); 
    gaussianWeightTotal += gaussianWeight; 
    sum += sampleColor * gaussianWeight; 

    sampleColor = texture2D(inputImageTexture, blurCoordinates[1]); 
    distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); 
    gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor); 
    gaussianWeightTotal += gaussianWeight; 
    sum += sampleColor * gaussianWeight; 

    sampleColor = texture2D(inputImageTexture, blurCoordinates[2]); 
    distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); 
    gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor); 
    gaussianWeightTotal += gaussianWeight; 
    sum += sampleColor * gaussianWeight; 

    sampleColor = texture2D(inputImageTexture, blurCoordinates[3]); 
    distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); 
    gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor); 
    gaussianWeightTotal += gaussianWeight; 
    sum += sampleColor * gaussianWeight; 

    sampleColor = texture2D(inputImageTexture, blurCoordinates[5]); 
    distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); 
    gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor); 
    gaussianWeightTotal += gaussianWeight; 
    sum += sampleColor * gaussianWeight; 

    sampleColor = texture2D(inputImageTexture, blurCoordinates[6]); 
    distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); 
    gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor); 
    gaussianWeightTotal += gaussianWeight; 
    sum += sampleColor * gaussianWeight; 

    sampleColor = texture2D(inputImageTexture, blurCoordinates[7]); 
    distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); 
    gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor); 
    gaussianWeightTotal += gaussianWeight; 
    sum += sampleColor * gaussianWeight; 

    sampleColor = texture2D(inputImageTexture, blurCoordinates[8]); 
    distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0); 
    gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor); 
    gaussianWeightTotal += gaussianWeight; 
    sum += sampleColor * gaussianWeight; 

    gl_FragColor = sum/gaussianWeightTotal; 
} 
+0

좋은 답변입니다. 오픈 소스 프로젝트와 샘플 코드가 포함 된 것을 좋아합니다. –

+0

@ 브래드 라슨 : 감사합니다. 해결책을 얻었습니다. –

+0

@Brad Larson : 이미지의 특정 부분에만 필터 효과를 적용 할 수 있습니까? 전체 이미지가 아님 내 이미지 너비가 320이라고 가정합니다. 따라서 60에서 70px까지 필터 효과를 추가하고 200-220px에서 필터 효과를 추가하고 싶습니다. 그래서 필터 효과가 전체 이미지에 적용되지 않습니다. –

관련 문제