Skip to content

Commit abd3dbe

Browse files
committed
Merge pull request cats-oss#188 from wysaid/master
Add Bilateral Filter for Andorid-GPUImage
2 parents 2e78e97 + 5e7fd6c commit abd3dbe

File tree

4 files changed

+179
-5
lines changed

4 files changed

+179
-5
lines changed

gradle.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ VERSION_NAME=1.2.3
22
VERSION_CODE=8
33
GROUP=jp.co.cyberagent.android.gpuimage
44

5-
COMPILE_SDK_VERSION=21
6-
BUILD_TOOLS_VERSION=21.1.2
7-
TARGET_SDK_VERSION=21
5+
COMPILE_SDK_VERSION=22
6+
BUILD_TOOLS_VERSION=22.0.1
7+
TARGET_SDK_VERSION=22
88
MIN_SDK_VERSION=8
99

1010
POM_DESCRIPTION=Image filters for Android with OpenGL (based on GPUImage for iOS)
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
/**
2+
* @author wysaid
3+
4+
*
5+
*/
6+
7+
package jp.co.cyberagent.android.gpuimage;
8+
9+
import android.opengl.GLES20;
10+
11+
12+
public class GPUImageBilateralFilter extends GPUImageFilter {
13+
public static final String BILATERAL_VERTEX_SHADER = "" +
14+
"attribute vec4 position;\n" +
15+
"attribute vec4 inputTextureCoordinate;\n" +
16+
17+
"const int GAUSSIAN_SAMPLES = 9;\n" +
18+
19+
"uniform vec2 singleStepOffset;\n" +
20+
21+
"varying vec2 textureCoordinate;\n" +
22+
"varying vec2 blurCoordinates[GAUSSIAN_SAMPLES];\n" +
23+
24+
"void main()\n" +
25+
"{\n" +
26+
" gl_Position = position;\n" +
27+
" textureCoordinate = inputTextureCoordinate.xy;\n" +
28+
29+
" int multiplier = 0;\n" +
30+
" vec2 blurStep;\n" +
31+
32+
" for (int i = 0; i < GAUSSIAN_SAMPLES; i++)\n" +
33+
" {\n" +
34+
" multiplier = (i - ((GAUSSIAN_SAMPLES - 1) / 2));\n" +
35+
36+
" blurStep = float(multiplier) * singleStepOffset;\n" +
37+
" blurCoordinates[i] = inputTextureCoordinate.xy + blurStep;\n" +
38+
" }\n" +
39+
"}";
40+
41+
public static final String BILATERAL_FRAGMENT_SHADER = "" +
42+
"uniform sampler2D inputImageTexture;\n" +
43+
44+
" const lowp int GAUSSIAN_SAMPLES = 9;\n" +
45+
46+
" varying highp vec2 textureCoordinate;\n" +
47+
" varying highp vec2 blurCoordinates[GAUSSIAN_SAMPLES];\n" +
48+
49+
" uniform mediump float distanceNormalizationFactor;\n" +
50+
51+
" void main()\n" +
52+
" {\n" +
53+
" lowp vec4 centralColor;\n" +
54+
" lowp float gaussianWeightTotal;\n" +
55+
" lowp vec4 sum;\n" +
56+
" lowp vec4 sampleColor;\n" +
57+
" lowp float distanceFromCentralColor;\n" +
58+
" lowp float gaussianWeight;\n" +
59+
" \n" +
60+
" centralColor = texture2D(inputImageTexture, blurCoordinates[4]);\n" +
61+
" gaussianWeightTotal = 0.18;\n" +
62+
" sum = centralColor * 0.18;\n" +
63+
" \n" +
64+
" sampleColor = texture2D(inputImageTexture, blurCoordinates[0]);\n" +
65+
" distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);\n" +
66+
" gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor);\n" +
67+
" gaussianWeightTotal += gaussianWeight;\n" +
68+
" sum += sampleColor * gaussianWeight;\n" +
69+
70+
" sampleColor = texture2D(inputImageTexture, blurCoordinates[1]);\n" +
71+
" distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);\n" +
72+
" gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor);\n" +
73+
" gaussianWeightTotal += gaussianWeight;\n" +
74+
" sum += sampleColor * gaussianWeight;\n" +
75+
76+
" sampleColor = texture2D(inputImageTexture, blurCoordinates[2]);\n" +
77+
" distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);\n" +
78+
" gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor);\n" +
79+
" gaussianWeightTotal += gaussianWeight;\n" +
80+
" sum += sampleColor * gaussianWeight;\n" +
81+
82+
" sampleColor = texture2D(inputImageTexture, blurCoordinates[3]);\n" +
83+
" distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);\n" +
84+
" gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor);\n" +
85+
" gaussianWeightTotal += gaussianWeight;\n" +
86+
" sum += sampleColor * gaussianWeight;\n" +
87+
88+
" sampleColor = texture2D(inputImageTexture, blurCoordinates[5]);\n" +
89+
" distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);\n" +
90+
" gaussianWeight = 0.15 * (1.0 - distanceFromCentralColor);\n" +
91+
" gaussianWeightTotal += gaussianWeight;\n" +
92+
" sum += sampleColor * gaussianWeight;\n" +
93+
94+
" sampleColor = texture2D(inputImageTexture, blurCoordinates[6]);\n" +
95+
" distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);\n" +
96+
" gaussianWeight = 0.12 * (1.0 - distanceFromCentralColor);\n" +
97+
" gaussianWeightTotal += gaussianWeight;\n" +
98+
" sum += sampleColor * gaussianWeight;\n" +
99+
100+
" sampleColor = texture2D(inputImageTexture, blurCoordinates[7]);\n" +
101+
" distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);\n" +
102+
" gaussianWeight = 0.09 * (1.0 - distanceFromCentralColor);\n" +
103+
" gaussianWeightTotal += gaussianWeight;\n" +
104+
" sum += sampleColor * gaussianWeight;\n" +
105+
106+
" sampleColor = texture2D(inputImageTexture, blurCoordinates[8]);\n" +
107+
" distanceFromCentralColor = min(distance(centralColor, sampleColor) * distanceNormalizationFactor, 1.0);\n" +
108+
" gaussianWeight = 0.05 * (1.0 - distanceFromCentralColor);\n" +
109+
" gaussianWeightTotal += gaussianWeight;\n" +
110+
" sum += sampleColor * gaussianWeight;\n" +
111+
" gl_FragColor = sum / gaussianWeightTotal;\n" +
112+
// " gl_FragColor.r = distanceNormalizationFactor / 20.0;" +
113+
" }";
114+
115+
private float mDistanceNormalizationFactor;
116+
private int mDisFactorLocation;
117+
private int mSingleStepOffsetLocation;
118+
119+
public GPUImageBilateralFilter() {
120+
this(8.0f);
121+
}
122+
123+
public GPUImageBilateralFilter(final float distanceNormalizationFactor) {
124+
super(BILATERAL_VERTEX_SHADER, BILATERAL_FRAGMENT_SHADER);
125+
mDistanceNormalizationFactor = distanceNormalizationFactor;
126+
}
127+
128+
@Override
129+
public void onInit() {
130+
super.onInit();
131+
mDisFactorLocation = GLES20.glGetUniformLocation(getProgram(), "distanceNormalizationFactor");
132+
mSingleStepOffsetLocation = GLES20.glGetUniformLocation(getProgram(), "singleStepOffset");
133+
}
134+
135+
@Override
136+
public void onInitialized() {
137+
super.onInitialized();
138+
setDistanceNormalizationFactor(mDistanceNormalizationFactor);
139+
}
140+
141+
public void setDistanceNormalizationFactor(final float newValue) {
142+
mDistanceNormalizationFactor = newValue;
143+
setFloat(mDisFactorLocation, newValue);
144+
}
145+
146+
private void setTexelSize(final float w, final float h) {
147+
setFloatVec2(mSingleStepOffsetLocation, new float[] {1.0f / w, 1.0f / h});
148+
}
149+
150+
@Override
151+
public void onOutputSizeChanged(final int width, final int height) {
152+
super.onOutputSizeChanged(width, height);
153+
setTexelSize(width, height);
154+
}
155+
}

library/src/jp/co/cyberagent/android/gpuimage/PixelBuffer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ private void convertToBitmap() {
194194
mGL.glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, ib);
195195
int[] ia = ib.array();
196196

197+
//Stupid !
197198
// Convert upside down mirror-reversed image to right-side up normal
198199
// image.
199200
for (int i = 0; i < mHeight; i++) {

sample/src/jp/co/cyberagent/android/gpuimage/sample/GPUImageFilterTools.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ public static void showDialog(final Context context,
106106

107107
filters.addFilter("Levels Min (Mid Adjust)", FilterType.LEVELS_FILTER_MIN);
108108

109+
filters. addFilter("Bilateral Blur", FilterType.BILATERAL_BLUR);
110+
111+
109112
AlertDialog.Builder builder = new AlertDialog.Builder(context);
110113
builder.setTitle("Choose a filter");
111114
builder.setItems(filters.names.toArray(new String[filters.names.size()]),
@@ -287,6 +290,9 @@ private static GPUImageFilter createFilterForType(final Context context, final F
287290
levelsFilter.setMin(0.0f, 3.0f, 1.0f);
288291
return levelsFilter;
289292

293+
case BILATERAL_BLUR:
294+
return new GPUImageBilateralFilter();
295+
290296
default:
291297
throw new IllegalStateException("No filter of that type!");
292298
}
@@ -314,7 +320,7 @@ private enum FilterType {
314320
BLEND_DISSOLVE, BLEND_EXCLUSION, BLEND_SOURCE_OVER, BLEND_HARD_LIGHT, BLEND_LIGHTEN, BLEND_ADD, BLEND_DIVIDE, BLEND_MULTIPLY, BLEND_OVERLAY, BLEND_SCREEN, BLEND_ALPHA,
315321
BLEND_COLOR, BLEND_HUE, BLEND_SATURATION, BLEND_LUMINOSITY, BLEND_LINEAR_BURN, BLEND_SOFT_LIGHT, BLEND_SUBTRACT, BLEND_CHROMA_KEY, BLEND_NORMAL, LOOKUP_AMATORKA,
316322
GAUSSIAN_BLUR, CROSSHATCH, BOX_BLUR, CGA_COLORSPACE, DILATION, KUWAHARA, RGB_DILATION, SKETCH, TOON, SMOOTH_TOON, BULGE_DISTORTION, GLASS_SPHERE, HAZE, LAPLACIAN, NON_MAXIMUM_SUPPRESSION,
317-
SPHERE_REFRACTION, SWIRL, WEAK_PIXEL_INCLUSION, FALSE_COLOR, COLOR_BALANCE, LEVELS_FILTER_MIN
323+
SPHERE_REFRACTION, SWIRL, WEAK_PIXEL_INCLUSION, FALSE_COLOR, COLOR_BALANCE, LEVELS_FILTER_MIN, BILATERAL_BLUR
318324
}
319325

320326
private static class FilterList {
@@ -389,7 +395,11 @@ public FilterAdjuster(final GPUImageFilter filter) {
389395
adjuster = new ColorBalanceAdjuster().filter(filter);
390396
} else if (filter instanceof GPUImageLevelsFilter) {
391397
adjuster = new LevelsMinMidAdjuster().filter(filter);
392-
} else {
398+
} else if (filter instanceof GPUImageBilateralFilter) {
399+
adjuster = new BilateralAdjuster().filter(filter);
400+
}
401+
else {
402+
393403
adjuster = null;
394404
}
395405
}
@@ -643,5 +653,13 @@ public void adjust(int percentage) {
643653
getFilter().setMin(0.0f, range(percentage, 0.0f, 1.0f) , 1.0f);
644654
}
645655
}
656+
657+
private class BilateralAdjuster extends Adjuster<GPUImageBilateralFilter> {
658+
@Override
659+
public void adjust(final int percentage) {
660+
getFilter().setDistanceNormalizationFactor(range(percentage, 0.0f, 15.0f));
661+
}
662+
}
663+
646664
}
647665
}

0 commit comments

Comments
 (0)