Skip to content

Commit

Permalink
Added a color-based local binary pattern filter.
Browse files Browse the repository at this point in the history
  • Loading branch information
BradLarson committed Dec 9, 2015
1 parent 25c8146 commit b421e8a
Show file tree
Hide file tree
Showing 9 changed files with 201 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1016,6 +1016,17 @@ let filterOperations: Array<FilterOperationInterface> = [
},
filterOperationType:.SingleInput
),
FilterOperation <GPUImageColorLocalBinaryPatternFilter>(
listName:"Local binary pattern (color)",
titleName:"Local Binary Pattern (color)",
sliderConfiguration:.Enabled(minimumValue:1.0, maximumValue:5.0, initialValue:1.0),
sliderUpdateCallback: {(filter, sliderValue) in
let filterSize = filter.outputFrameSize()
filter.texelWidth = (sliderValue / filterSize.width)
filter.texelHeight = (sliderValue / filterSize.height)
},
filterOperationType:.SingleInput
),
FilterOperation <GPUImageDissolveBlendFilter>(
listName:"Dissolve blend",
titleName:"Dissolve Blend",
Expand Down
12 changes: 12 additions & 0 deletions framework/GPUImage.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,10 @@
BCF866C8172589A500912E34 /* GPUImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BC245DBF14DDBCF5009FE7EB /* GPUImage.h */; };
BCFB588715E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */; };
BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */; };
BCFC5F661C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFC5F641C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.h */; };
BCFC5F671C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFC5F651C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.m */; };
BCFC5F681C18C3D300C7F43B /* GPUImageColorLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFC5F641C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (Public, ); }; };
BCFC5F691C18C3E200C7F43B /* GPUImageColorLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFC5F651C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.m */; };
BEBE83B5155C092A00EEF8C3 /* GPUImageRGBFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */; };
BEBE83B6155C092A00EEF8C3 /* GPUImageRGBFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */; };
C04C8D1715F8059F00449601 /* GPUImageColorBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */; };
Expand Down Expand Up @@ -1045,6 +1049,8 @@
BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLocalBinaryPatternFilter.m; path = Source/GPUImageLocalBinaryPatternFilter.m; sourceTree = SOURCE_ROOT; };
BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageLanczosResamplingFilter.h; path = Source/GPUImageLanczosResamplingFilter.h; sourceTree = SOURCE_ROOT; };
BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageLanczosResamplingFilter.m; path = Source/GPUImageLanczosResamplingFilter.m; sourceTree = SOURCE_ROOT; };
BCFC5F641C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorLocalBinaryPatternFilter.h; path = Source/GPUImageColorLocalBinaryPatternFilter.h; sourceTree = SOURCE_ROOT; };
BCFC5F651C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorLocalBinaryPatternFilter.m; path = Source/GPUImageColorLocalBinaryPatternFilter.m; sourceTree = SOURCE_ROOT; };
BEBE83B3155C092A00EEF8C3 /* GPUImageRGBFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageRGBFilter.h; path = Source/GPUImageRGBFilter.h; sourceTree = SOURCE_ROOT; };
BEBE83B4155C092A00EEF8C3 /* GPUImageRGBFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageRGBFilter.m; path = Source/GPUImageRGBFilter.m; sourceTree = SOURCE_ROOT; };
C04C8D1515F8059F00449601 /* GPUImageColorBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorBlendFilter.h; path = Source/GPUImageColorBlendFilter.h; sourceTree = SOURCE_ROOT; };
Expand Down Expand Up @@ -1445,6 +1451,8 @@
BC0690F6157C5075009274F9 /* GPUImageColorPackingFilter.m */,
BCF851BD15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.h */,
BCF851BE15CF5D59000EBC8B /* GPUImageLocalBinaryPatternFilter.m */,
BCFC5F641C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.h */,
BCFC5F651C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.m */,
BCFB588515E03E4F00750F12 /* GPUImageLanczosResamplingFilter.h */,
BCFB588615E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m */,
BCB3B46315F2BA9300EDA3BE /* GPUImageLowPassFilter.h */,
Expand Down Expand Up @@ -1682,6 +1690,7 @@
BCD81F11194404F3007133DB /* GPUImagePixellatePositionFilter.h in Headers */,
BCD81F12194404F4007133DB /* GPUImagePolkaDotFilter.h in Headers */,
BCD81F13194404F4007133DB /* GPUImageHalftoneFilter.h in Headers */,
BCFC5F681C18C3D300C7F43B /* GPUImageColorLocalBinaryPatternFilter.h in Headers */,
BCD81F14194404F4007133DB /* GPUImagePolarPixellateFilter.h in Headers */,
BCD81F15194404F4007133DB /* GPUImageCrosshatchFilter.h in Headers */,
BCD81F16194404F4007133DB /* GPUImageSketchFilter.h in Headers */,
Expand Down Expand Up @@ -1782,6 +1791,7 @@
BCC1E66B152368130006EFA5 /* GPUImageCGAColorspaceFilter.h in Headers */,
BCC1E66D152368130006EFA5 /* GPUImageCrosshatchFilter.h in Headers */,
BC7D95D51523EE67000DF037 /* GPUImageStillCamera.h in Headers */,
BCFC5F661C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.h in Headers */,
BCABED8E15263CF20098A93E /* GPUImagePolarPixellateFilter.h in Headers */,
BCBF617A16E4F44600E2784A /* GPUImageKuwaharaRadius3Filter.h in Headers */,
BCABED9015263CF20098A93E /* GPUImageStretchDistortionFilter.h in Headers */,
Expand Down Expand Up @@ -2150,6 +2160,7 @@
BCD81FC819440606007133DB /* GPUImageJFAVoronoiFilter.m in Sources */,
BCD81FC919440606007133DB /* GPUImageMosaicFilter.m in Sources */,
BCD81FCA19440606007133DB /* GPUImageVoronoiConsumerFilter.m in Sources */,
BCFC5F691C18C3E200C7F43B /* GPUImageColorLocalBinaryPatternFilter.m in Sources */,
BCD81FCB19440606007133DB /* GPUImageView.m in Sources */,
BCD81FCC19440606007133DB /* GPUImageMovieWriter.m in Sources */,
BCD81FCD19440606007133DB /* GPUImageTextureOutput.m in Sources */,
Expand Down Expand Up @@ -2296,6 +2307,7 @@
BCFB588815E03E4F00750F12 /* GPUImageLanczosResamplingFilter.m in Sources */,
BC3AC8B115E6F6170065144E /* GPUImageAverageColor.m in Sources */,
BCB79E1115EBE1A700965D92 /* GPUImageSolidColorGenerator.m in Sources */,
BCFC5F671C18C3B100C7F43B /* GPUImageColorLocalBinaryPatternFilter.m in Sources */,
BCB79E6015EC131A00965D92 /* GPUImageLuminosity.m in Sources */,
BCB79E7B15EC2A8400965D92 /* GPUImageAverageLuminanceThresholdFilter.m in Sources */,
BC99234F15EFFC8700ED2C8C /* GPUImageChromaKeyFilter.m in Sources */,
Expand Down
8 changes: 8 additions & 0 deletions framework/GPUImageMac.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,8 @@
BCF8689E1728862100912E34 /* GPUImageOpacityFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF8689C1728861F00912E34 /* GPUImageOpacityFilter.m */; };
BCF868A11728866400912E34 /* GPUImageAlphaBlendFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF8689F1728865500912E34 /* GPUImageAlphaBlendFilter.h */; settings = {ATTRIBUTES = (Public, ); }; };
BCF868A21728866400912E34 /* GPUImageAlphaBlendFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCF868A01728865D00912E34 /* GPUImageAlphaBlendFilter.m */; };
BCFC5F611C18BDBA00C7F43B /* GPUImageColorLocalBinaryPatternFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = BCFC5F5F1C18BDBA00C7F43B /* GPUImageColorLocalBinaryPatternFilter.h */; settings = {ATTRIBUTES = (Public, ); }; };
BCFC5F621C18BDBA00C7F43B /* GPUImageColorLocalBinaryPatternFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = BCFC5F601C18BDBA00C7F43B /* GPUImageColorLocalBinaryPatternFilter.m */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
Expand Down Expand Up @@ -652,6 +654,8 @@
BCF8689C1728861F00912E34 /* GPUImageOpacityFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageOpacityFilter.m; path = Source/GPUImageOpacityFilter.m; sourceTree = SOURCE_ROOT; };
BCF8689F1728865500912E34 /* GPUImageAlphaBlendFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageAlphaBlendFilter.h; path = Source/GPUImageAlphaBlendFilter.h; sourceTree = SOURCE_ROOT; };
BCF868A01728865D00912E34 /* GPUImageAlphaBlendFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageAlphaBlendFilter.m; path = Source/GPUImageAlphaBlendFilter.m; sourceTree = SOURCE_ROOT; };
BCFC5F5F1C18BDBA00C7F43B /* GPUImageColorLocalBinaryPatternFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GPUImageColorLocalBinaryPatternFilter.h; path = Source/GPUImageColorLocalBinaryPatternFilter.h; sourceTree = SOURCE_ROOT; };
BCFC5F601C18BDBA00C7F43B /* GPUImageColorLocalBinaryPatternFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GPUImageColorLocalBinaryPatternFilter.m; path = Source/GPUImageColorLocalBinaryPatternFilter.m; sourceTree = SOURCE_ROOT; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -1029,6 +1033,8 @@
BC6C55451730BDCF00EB222D /* GPUImageLanczosResamplingFilter.m */,
BCA20BB917471C3D0097C84A /* GPUImageLocalBinaryPatternFilter.h */,
BCA20BBA17471C3F0097C84A /* GPUImageLocalBinaryPatternFilter.m */,
BCFC5F5F1C18BDBA00C7F43B /* GPUImageColorLocalBinaryPatternFilter.h */,
BCFC5F601C18BDBA00C7F43B /* GPUImageColorLocalBinaryPatternFilter.m */,
BC4DFD011C10D2FD0095A016 /* GPUImageColourFASTFeatureDetector.h */,
BC4DFD021C10D2FD0095A016 /* GPUImageColourFASTFeatureDetector.m */,
BC4DFD051C10D4860095A016 /* GPUImageColourFASTSamplingOperation.h */,
Expand Down Expand Up @@ -1108,6 +1114,7 @@
A87E5E12177648F3007FD5B1 /* GPUImageRawDataOutput.h in Headers */,
BCF40F1217247D68005AE36A /* GPUImageContext.h in Headers */,
BCF40F1617247FD8005AE36A /* GLProgram.h in Headers */,
BCFC5F611C18BDBA00C7F43B /* GPUImageColorLocalBinaryPatternFilter.h in Headers */,
BCF40F1B1724829B005AE36A /* GPUImageOutput.h in Headers */,
BCF40F2017248322005AE36A /* GPUImageFilter.h in Headers */,
BCF40F2517248836005AE36A /* GPUImageView.h in Headers */,
Expand Down Expand Up @@ -1431,6 +1438,7 @@
BCE817BF173608690071D084 /* GPUImageThresholdEdgeDetectionFilter.m in Sources */,
BCE817C31736092A0071D084 /* GPUImageXYDerivativeFilter.m in Sources */,
BCE817CD17360BFD0071D084 /* GPUImageDirectionalNonMaximumSuppressionFilter.m in Sources */,
BCFC5F621C18BDBA00C7F43B /* GPUImageColorLocalBinaryPatternFilter.m in Sources */,
BCE817CF17360BFD0071D084 /* GPUImageDirectionalSobelEdgeDetectionFilter.m in Sources */,
BCE817D317360C6A0071D084 /* GPUImageWeakPixelInclusionFilter.m in Sources */,
BCE2EF8917459D5B00C0628C /* GPUImageHarrisCornerDetectionFilter.m in Sources */,
Expand Down
1 change: 1 addition & 0 deletions framework/Source/GPUImage.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@
#import "GPUImageDivideBlendFilter.h"
#import "GPUImagePolkaDotFilter.h"
#import "GPUImageLocalBinaryPatternFilter.h"
#import "GPUImageColorLocalBinaryPatternFilter.h"
#import "GPUImageLanczosResamplingFilter.h"
#import "GPUImageAverageColor.h"
#import "GPUImageSolidColorGenerator.h"
Expand Down
5 changes: 5 additions & 0 deletions framework/Source/GPUImageColorLocalBinaryPatternFilter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#import "GPUImage3x3TextureSamplingFilter.h"

@interface GPUImageColorLocalBinaryPatternFilter : GPUImage3x3TextureSamplingFilter

@end
159 changes: 159 additions & 0 deletions framework/Source/GPUImageColorLocalBinaryPatternFilter.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
#import "GPUImageColorLocalBinaryPatternFilter.h"

// This is based on "Accelerating image recognition on mobile devices using GPGPU" by Miguel Bordallo Lopez, Henri Nykanen, Jari Hannuksela, Olli Silven and Markku Vehvilainen
// http://www.ee.oulu.fi/~jhannuks/publications/SPIE2011a.pdf

// Right pixel is the most significant bit, traveling clockwise to get to the upper right, which is the least significant
// If the external pixel is greater than or equal to the center, set to 1, otherwise 0
//
// 2 1 0
// 3 7
// 4 5 6

// 01101101
// 76543210

@implementation GPUImageColorLocalBinaryPatternFilter

#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE
NSString *const kGPUImageColorLocalBinaryPatternFragmentShaderString = SHADER_STRING
(
precision highp float;

varying vec2 textureCoordinate;
varying vec2 leftTextureCoordinate;
varying vec2 rightTextureCoordinate;

varying vec2 topTextureCoordinate;
varying vec2 topLeftTextureCoordinate;
varying vec2 topRightTextureCoordinate;

varying vec2 bottomTextureCoordinate;
varying vec2 bottomLeftTextureCoordinate;
varying vec2 bottomRightTextureCoordinate;

uniform sampler2D inputImageTexture;

void main()
{
lowp vec3 centerColor = texture2D(inputImageTexture, textureCoordinate).rgb;
lowp vec3 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb;
lowp vec3 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).rgb;
lowp vec3 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).rgb;
lowp vec3 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb;
lowp vec3 leftColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb;
lowp vec3 rightColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb;
lowp vec3 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb;
lowp vec3 topColor = texture2D(inputImageTexture, topTextureCoordinate).rgb;

lowp float redByteTally = 1.0 / 255.0 * step(centerColor.r, topRightColor.r);
redByteTally += 2.0 / 255.0 * step(centerColor.r, topColor.r);
redByteTally += 4.0 / 255.0 * step(centerColor.r, topLeftColor.r);
redByteTally += 8.0 / 255.0 * step(centerColor.r, leftColor.r);
redByteTally += 16.0 / 255.0 * step(centerColor.r, bottomLeftColor.r);
redByteTally += 32.0 / 255.0 * step(centerColor.r, bottomColor.r);
redByteTally += 64.0 / 255.0 * step(centerColor.r, bottomRightColor.r);
redByteTally += 128.0 / 255.0 * step(centerColor.r, rightColor.r);

lowp float blueByteTally = 1.0 / 255.0 * step(centerColor.b, topRightColor.b);
blueByteTally += 2.0 / 255.0 * step(centerColor.b, topColor.b);
blueByteTally += 4.0 / 255.0 * step(centerColor.b, topLeftColor.b);
blueByteTally += 8.0 / 255.0 * step(centerColor.b, leftColor.b);
blueByteTally += 16.0 / 255.0 * step(centerColor.b, bottomLeftColor.b);
blueByteTally += 32.0 / 255.0 * step(centerColor.b, bottomColor.b);
blueByteTally += 64.0 / 255.0 * step(centerColor.b, bottomRightColor.b);
blueByteTally += 128.0 / 255.0 * step(centerColor.b, rightColor.b);

lowp float greenByteTally = 1.0 / 255.0 * step(centerColor.g, topRightColor.g);
greenByteTally += 2.0 / 255.0 * step(centerColor.g, topColor.g);
greenByteTally += 4.0 / 255.0 * step(centerColor.g, topLeftColor.g);
greenByteTally += 8.0 / 255.0 * step(centerColor.g, leftColor.g);
greenByteTally += 16.0 / 255.0 * step(centerColor.g, bottomLeftColor.g);
greenByteTally += 32.0 / 255.0 * step(centerColor.g, bottomColor.g);
greenByteTally += 64.0 / 255.0 * step(centerColor.g, bottomRightColor.g);
greenByteTally += 128.0 / 255.0 * step(centerColor.g, rightColor.g);

// TODO: Replace the above with a dot product and two vec4s
// TODO: Apply step to a matrix, rather than individually

gl_FragColor = vec4(redByteTally, blueByteTally, greenByteTally, 1.0);
}
);
#else
NSString *const kGPUImageColorLocalBinaryPatternFragmentShaderString = SHADER_STRING
(
varying vec2 textureCoordinate;
varying vec2 leftTextureCoordinate;
varying vec2 rightTextureCoordinate;

varying vec2 topTextureCoordinate;
varying vec2 topLeftTextureCoordinate;
varying vec2 topRightTextureCoordinate;

varying vec2 bottomTextureCoordinate;
varying vec2 bottomLeftTextureCoordinate;
varying vec2 bottomRightTextureCoordinate;

uniform sampler2D inputImageTexture;

void main()
{
vec3 centerColor = texture2D(inputImageTexture, textureCoordinate).rgb;
vec3 bottomLeftColor = texture2D(inputImageTexture, bottomLeftTextureCoordinate).rgb;
vec3 topRightColor = texture2D(inputImageTexture, topRightTextureCoordinate).rgb;
vec3 topLeftColor = texture2D(inputImageTexture, topLeftTextureCoordinate).rgb;
vec3 bottomRightColor = texture2D(inputImageTexture, bottomRightTextureCoordinate).rgb;
vec3 leftColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb;
vec3 rightColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb;
vec3 bottomColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb;
vec3 topColor = texture2D(inputImageTexture, topTextureCoordinate).rgb;

float redByteTally = 1.0 / 255.0 * step(centerColor.r, topRightColor.r);
redByteTally += 2.0 / 255.0 * step(centerColor.r, topColor.r);
redByteTally += 4.0 / 255.0 * step(centerColor.r, topLeftColor.r);
redByteTally += 8.0 / 255.0 * step(centerColor.r, leftColor.r);
redByteTally += 16.0 / 255.0 * step(centerColor.r, bottomLeftColor.r);
redByteTally += 32.0 / 255.0 * step(centerColor.r, bottomColor.r);
redByteTally += 64.0 / 255.0 * step(centerColor.r, bottomRightColor.r);
redByteTally += 128.0 / 255.0 * step(centerColor.r, rightColor.r);

float blueByteTally = 1.0 / 255.0 * step(centerColor.b, topRightColor.b);
blueByteTally += 2.0 / 255.0 * step(centerColor.b, topColor.b);
blueByteTally += 4.0 / 255.0 * step(centerColor.b, topLeftColor.b);
blueByteTally += 8.0 / 255.0 * step(centerColor.b, leftColor.b);
blueByteTally += 16.0 / 255.0 * step(centerColor.b, bottomLeftColor.b);
blueByteTally += 32.0 / 255.0 * step(centerColor.b, bottomColor.b);
blueByteTally += 64.0 / 255.0 * step(centerColor.b, bottomRightColor.b);
blueByteTally += 128.0 / 255.0 * step(centerColor.b, rightColor.b);

float greenByteTally = 1.0 / 255.0 * step(centerColor.g, topRightColor.g);
greenByteTally += 2.0 / 255.0 * step(centerColor.g, topColor.g);
greenByteTally += 4.0 / 255.0 * step(centerColor.g, topLeftColor.g);
greenByteTally += 8.0 / 255.0 * step(centerColor.g, leftColor.g);
greenByteTally += 16.0 / 255.0 * step(centerColor.g, bottomLeftColor.g);
greenByteTally += 32.0 / 255.0 * step(centerColor.g, bottomColor.g);
greenByteTally += 64.0 / 255.0 * step(centerColor.g, bottomRightColor.g);
greenByteTally += 128.0 / 255.0 * step(centerColor.g, rightColor.g);

// TODO: Replace the above with a dot product and two vec4s
// TODO: Apply step to a matrix, rather than individually

gl_FragColor = vec4(redByteTally, blueByteTally, greenByteTally, 1.0);
}
);
#endif

#pragma mark -
#pragma mark Initialization and teardown

- (id)init;
{
if (!(self = [super initWithFragmentShaderFromString:kGPUImageColorLocalBinaryPatternFragmentShaderString]))
{
return nil;
}

return self;
}

@end
Loading

0 comments on commit b421e8a

Please sign in to comment.