2016-03-21 4 views
0

Где не указан этот вопрос, просто строится сверху CameraCaptureActivity в рамках проекта grafika, найденного на github.Android - эффект гауссовского размытия - OpenGL

Он имеет встроенный эффект размытия, который использует 3х3 ядру

kernel = new float[] { 
    1f/16f, 2f/16f, 1f/16f, 
    2f/16f, 4f/16f, 2f/16f, 
    1f/16f, 2f/16f, 1f/16f }; 

Однако этот эффект размытия не является достаточно сильным, им ищет что-то вроде того, что гауссова эффект может сделать на прошивке с UIVisualEffectView, это выглядит что-то вроде этого:

Хорошего гладкого тяжелого эффекта размытия, но до сих пор лучший ив удался это:

Как вы можете видеть это не является столь же гладким, а также немного квадратным.

я достиг этого путем преобразования в 5x5 ядра, генерируемого с использованием этого handy tool с сигма 30 и размера ядра из 5. Он производит следующее:

kernel = new float[] { 
    0.039911f, 0.039978f, 0.04f,  0.039978f, 0.039911f, 
    0.039978f, 0.040044f, 0.040067f, 0.040044f, 0.039978f, 
    0.04f,  0.040067f, 0.040089f, 0.040067f, 0.04f, 
    0.039978f, 0.040044f, 0.040067f, 0.040044f, 0.039978f, 
    0.039911f, 0.039978f, 0.04f,  0.039978f, 0.039911f 
}; 

Для того, чтобы получить, чтобы работать в пределах Grafika проект я должен был изменить KERNEL_SIZE и mTexOffset в Texture2dProgram класса

KERNEL_SIZE теперь 25 и mTextOffset теперь рассчитывается следующим образом:

public void setTexSize(int width, int height) { 

    float rw = 50.0f/width; 
    float rh = 50.0f/height; 

    float rw50 = rw * 0.5f; 
    float rh50 = rh * 0.5f; 

    mTexOffset = new float[] { 
      -rw, -rh, -rw50, -rh,  0f, -rh, rw50, -rh,  rw, -rh, 
      -rw, -rh50, -rw50, -rh50, 0f, -rh50, rw50, -rh50, rw, -rh50, 
      -rw, 0f, -rw50, 0f,  0f, 0f,  rw50, -0f,  rw, 0f, 
      -rw, rh50, -rw50, rh50, 0f, rh50, rw50, rh50,  rw, rh50, 
      -rw, rh, -rw50, rh,  0f, rh,  rw50, rh,  rw, rh 
    }; 
}; 

У кого-нибудь есть предложения по поводу того, что я мог бы изменить для достижения iOS-подобного размытия (я думаю, что iOS также является освещающим пиксели)? Я думаю, что, когда я действительно ошибаюсь, это вычисление setTextSize(), в частности значение 50.0f, я только что выщипывал это из-за тонкого воздуха и наблюдал, что он имеет

ответ

2

Свертка с фактическим явлением размытия - задача, даже на графическом процессоре. Есть несколько методов, которые делают его работу лучше:

  • Гауссово ядро ​​можно разложить на X и Y компоненты, которые вычисляются по отдельности. Этот метод используется программами обработки изображений, поскольку он относительно быстрый и точный.

  • Вместо использования гауссова ядра вы можете использовать выборку дисков Poisson для размытия изображения.

  • Вы можете использовать многопроходный фильтр Kawase в качестве приближения к гауссовскому фильтру.

  • Сэмплирование с карт с низким разрешением mip приведет к повышению производительности для данного субъективного качества размытия.

  • Вы можете выбирать между текселями, чтобы захватить интерполяцию текстур и получить больше кранов, чем вы могли бы получить.

Как правило, требуется тонкая настройка, чтобы заставить его «выглядеть правильно», как только вы начнете делать эти компромиссы. Хорошее резюме доступно по адресу An investigation of fast real-time GPU-based image blur algorithms (Filip S., 2014).

Смежные вопросы