Difference between revisions of "ForkLoop Images Assignment"
Line 6: | Line 6: | ||
==HsvColor== | ==HsvColor== | ||
{{HsvColorWithMethodLinks}} | {{HsvColorWithMethodLinks}} | ||
+ | |||
+ | ==PixelFiler== | ||
+ | {{PixelFilterWithApplyLinks}} | ||
=Code To Investigate= | =Code To Investigate= |
Revision as of 05:34, 3 February 2023
Contents
Motivation
We gain experience using a parallel fork loop. Image processing often presents the opportunity for a lot of parallelism. Here we will operate on a single image, making a parallel task for each row.
Background
Revisit the Image Batch Race Condition Exercise's Background section for information on pixels and images.
HsvColor
class HsvColor
PixelFiler
interface PixelFilter extends UnaryOperator<HsvColor>
Code To Investigate
Image Batch Race Condition Exercise
Image Batch Race Condition Code To Investigate
PixelFilters
Our Image Filter will apply a PixelFilter to every pixel in a specified image.
Some example pixel filters have been provided which use named classes, anonymous classes, and lambdas:
class PixelFilters |
---|
public class PixelFilters { private static class HueSettingPixelFilter implements PixelFilter { private final double hue; public HueSettingPixelFilter(double hue) { this.hue = hue; } @Override public HsvColor apply(HsvColor src) { double saturation = src.saturation(); double value = src.value(); return new HsvColor(hue, saturation, value); } } public static PixelFilter hueSettingPixelFilterOf(double hue) { // return new instance of named class HueSettingPixelFilter return new HueSettingPixelFilter(hue); } public static PixelFilter hueAdjustingPixelFilterOf(double deltaHue) { // return new instance of anonymous class return new PixelFilter() { @Override public HsvColor apply(HsvColor src) { double hue = src.hue(); double saturation = src.saturation(); double value = src.value(); return new HsvColor(hue + deltaHue, saturation, value); } }; } public static PixelFilter saturationAdjustingPixelFilterOf(double deltaSaturation) { // return anonymous function (also known as a lambda) with parameter type return (HsvColor src) -> { double hue = src.hue(); double saturation = src.saturation(); double value = src.value(); return new HsvColor(hue, saturation + deltaSaturation, value); }; } public static PixelFilter valueAdjustingPixelFilterOf(double deltaValue) { // return anonymous function (also known as a lambda) without parameter type return src -> { double hue = src.hue(); double saturation = src.saturation(); double value = src.value(); return new HsvColor(hue, saturation, value + deltaValue); }; } } |
Code To Implement
ParallelTaskPerRowImageFilter
class: | ParallelTaskPerRowImageFilter.java | |
methods: | apply | |
package: | imagefilter.exercise | |
source folder: | student/src/main/java |
apply
method: public HsvImage apply(HsvImage src, PixelFilter pixelFilter)
(parallel implementation required)
Warning: When saving the result of pixelFilter.apply(), always put the result in a new array. Don't overwrite values of the source array. |
To complete this method we must return a new instance of the interface HsvImage. The provided class DefaultHsvImage implements HsvImage so should serve well.
Nicely, DefaultHsvImage provides both:
- a constructor which takes an List<HsvColor[]> and,
- another constructor which takes an HsvColor[][].
These two constructors match up well with the two different return types of the many incantations of join_fork_loop:
where R is the return type of the TaskFunction<T, R> passed to the join_fork_loop.
What should the return type from the this TaskFunction be?
Visualization
class: | ImageFilterApp.java | VIZ |
package: | imagefilter.viz | |
source folder: | student/src/main/java |
Testing Your Solution
class: | __ParallelTaskPerRowImageFilterTestSuite.java | |
package: | imagefilter.exercise | |
source folder: | testing/src/test/java |
Pledge, Acknowledgments, Citations
file: | exercise-fork-loop-images-pledge-acknowledgments-citations.txt |
More info about the Honor Pledge