Skip to content

Commit

Permalink
Add AccDirectionalNonMaximumSuppressionFilter
Browse files Browse the repository at this point in the history
  • Loading branch information
wangjwchn committed Apr 5, 2016
1 parent bf4d452 commit 3aeb176
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 1 deletion.
32 changes: 32 additions & 0 deletions AccImageFilter/AccDirectionalNonMaximumSuppressionFilter.metal
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// AccDirectionalNonMaximumSuppressionFilter.metal
// MetalAcc
//
// Created by 王佳玮 on 16/4/5.
// Copyright © 2016年 JW. All rights reserved.
//

#include <metal_stdlib>
using namespace metal;
kernel void DirectionalNonMaximumSuppression(texture2d<float, access::read> inTexture [[texture(0)]],
texture2d<float, access::write> outTexture [[texture(1)]],
device unsigned int *lowerThreshold [[buffer(0)]],
device unsigned int *upperThreshold [[buffer(1)]],
uint2 gid [[thread_position_in_grid]])
{
float3 currentGradientAndDirection = inTexture.read(gid).rgb;
uint2 gradientDirection = uint2((currentGradientAndDirection.gb * 2.0) - 1.0);
float firstSampledGradientMagnitude = inTexture.read(gid + gradientDirection).r;
float secondSampledGradientMagnitude = inTexture.read(gid - gradientDirection).r;

float multiplier = step(firstSampledGradientMagnitude, currentGradientAndDirection.r);
multiplier = multiplier * step(secondSampledGradientMagnitude, currentGradientAndDirection.r);

float thresholdCompliance = smoothstep(*lowerThreshold, *upperThreshold, currentGradientAndDirection.r);
multiplier = multiplier * thresholdCompliance;

float4 outColor = float4(multiplier, multiplier, multiplier, 1.0);
outTexture.write(outColor,gid);

}

19 changes: 19 additions & 0 deletions AccImageFilter/AccDirectionalNonMaximumSuppressionFilter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//
// AccDirectionalNonMaximumSuppressionFilter.swift
// MetalAcc
//
// Created by 王佳玮 on 16/4/5.
// Copyright © 2016年 JW. All rights reserved.
//

public class AccDirectionalNonMaximumSuppressionFilter: AccImageFilter {
public var threshold:(lower:Float,upper:Float)?
override public init(){
super.init()
self.threshold = (0.1,0.5)
self.name = "DirectionalNonMaximumSuppression"
}
override public func applyFilter() {
addCommandWithFactor([threshold!.lower,threshold!.upper])
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,6 @@ kernel void DirectionalSobelEdgeDetection(texture2d<float, access::read> inTextu
normalizedDirection = (normalizedDirection + 1.0) * 0.5; // Place -1.0 - 1.0 within 0 - 1.0

float4 outColor = float4(gradientMagnitude, normalizedDirection.x, normalizedDirection.y, 1.0);
outTexture.write(outColor,gid);
}

8 changes: 8 additions & 0 deletions MetalAcc.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@
282A2F951CB4082200D464C8 /* AccThresholdEdgeDetectionFilter.metal in Sources */ = {isa = PBXBuildFile; fileRef = 282A2F941CB4082200D464C8 /* AccThresholdEdgeDetectionFilter.metal */; };
282A2F971CB40A2900D464C8 /* AccDirectionalSobelEdgeDetectionFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 282A2F961CB40A2900D464C8 /* AccDirectionalSobelEdgeDetectionFilter.swift */; };
282A2F991CB40A3000D464C8 /* AccDirectionalSobelEdgeDetectionFilter.metal in Sources */ = {isa = PBXBuildFile; fileRef = 282A2F981CB40A3000D464C8 /* AccDirectionalSobelEdgeDetectionFilter.metal */; };
282A2F9B1CB40B4A00D464C8 /* AccDirectionalNonMaximumSuppressionFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 282A2F9A1CB40B4A00D464C8 /* AccDirectionalNonMaximumSuppressionFilter.swift */; };
282A2F9D1CB40B5000D464C8 /* AccDirectionalNonMaximumSuppressionFilter.metal in Sources */ = {isa = PBXBuildFile; fileRef = 282A2F9C1CB40B5000D464C8 /* AccDirectionalNonMaximumSuppressionFilter.metal */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
Expand Down Expand Up @@ -160,6 +162,8 @@
282A2F941CB4082200D464C8 /* AccThresholdEdgeDetectionFilter.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; path = AccThresholdEdgeDetectionFilter.metal; sourceTree = "<group>"; };
282A2F961CB40A2900D464C8 /* AccDirectionalSobelEdgeDetectionFilter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccDirectionalSobelEdgeDetectionFilter.swift; sourceTree = "<group>"; };
282A2F981CB40A3000D464C8 /* AccDirectionalSobelEdgeDetectionFilter.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; path = AccDirectionalSobelEdgeDetectionFilter.metal; sourceTree = "<group>"; };
282A2F9A1CB40B4A00D464C8 /* AccDirectionalNonMaximumSuppressionFilter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccDirectionalNonMaximumSuppressionFilter.swift; sourceTree = "<group>"; };
282A2F9C1CB40B5000D464C8 /* AccDirectionalNonMaximumSuppressionFilter.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; path = AccDirectionalNonMaximumSuppressionFilter.metal; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -250,6 +254,8 @@
282A2F941CB4082200D464C8 /* AccThresholdEdgeDetectionFilter.metal */,
282A2F961CB40A2900D464C8 /* AccDirectionalSobelEdgeDetectionFilter.swift */,
282A2F981CB40A3000D464C8 /* AccDirectionalSobelEdgeDetectionFilter.metal */,
282A2F9A1CB40B4A00D464C8 /* AccDirectionalNonMaximumSuppressionFilter.swift */,
282A2F9C1CB40B5000D464C8 /* AccDirectionalNonMaximumSuppressionFilter.metal */,
);
name = "Image processing";
sourceTree = "<group>";
Expand Down Expand Up @@ -408,6 +414,7 @@
282A2F511CB3970F00D464C8 /* AccGammaFilter.swift in Sources */,
282A2F4A1CB3970F00D464C8 /* AccContrastFilter.metal in Sources */,
282A2F691CB3970F00D464C8 /* AccSaturationFilter.metal in Sources */,
282A2F9D1CB40B5000D464C8 /* AccDirectionalNonMaximumSuppressionFilter.metal in Sources */,
282A2F451CB3970F00D464C8 /* AccChromaKeyFilter.swift in Sources */,
282A2F631CB3970F00D464C8 /* AccOpacityFilter.metal in Sources */,
282A2F6A1CB3970F00D464C8 /* AccSaturationFilter.swift in Sources */,
Expand Down Expand Up @@ -439,6 +446,7 @@
282A2F701CB3970F00D464C8 /* AccTransformFilter.swift in Sources */,
282A2F491CB3970F00D464C8 /* AccColorMatrixFilter.swift in Sources */,
282A2F8D1CB4059E00D464C8 /* AccLaplacianFilter.metal in Sources */,
282A2F9B1CB40B4A00D464C8 /* AccDirectionalNonMaximumSuppressionFilter.swift in Sources */,
282A2F931CB4081C00D464C8 /* AccThresholdEdgeDetectionFilter.swift in Sources */,
282A2F6B1CB3970F00D464C8 /* AccSepiaFilter.swift in Sources */,
282A2F971CB40A2900D464C8 /* AccDirectionalSobelEdgeDetectionFilter.swift in Sources */,
Expand Down
2 changes: 1 addition & 1 deletion MetalAcc/ViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class ViewController: UIViewController {
let accimage = AccImage()
accimage.AddImage(inimage)

let filter = AccMedian3x3Filter()
let filter = AccDirectionalNonMaximumSuppressionFilter()
accimage.AddFilter(filter)


Expand Down

0 comments on commit 3aeb176

Please sign in to comment.