**COS 426 Spring 2019: Assignment 0 Gallery** Winners (+2.0 points) =============================== ![**ch28**: This image is inspired by the vaporwave aesthetic I believe to be hip with the youngins. I attempted to mimic the pixel art genre by drawing squares according to their average RGB color (alas! Alvy Ray Smith would not be pleased with the term "pixel art"). I achieved the pick and green palette by swapping the RGB values with BRG values. The birds and waves were drawn with a function that rendered squares according to x, y, and size parameters. The waves were drawn before the pixelating routine to give them a softer look. For the optimal viewing experience, please complete the following steps: 1. Turn the brightness of your monitor all the way up. 2. Say out loud (preferably with an air of disgust), "Art CONTEST? Yet another example of capitalism corrupting the creative spirit." 3. Immediately after step two, begin playing [this video](https://www.youtube.com/watch?v=aQkPcPqTq4M). Congratulations! You're a vaporwave rockstar. Enjoy your newfound clout and intellect.](./gallery/ch28.gif border="1" width="640px") ----- ![Modern Art](./gallery/ehayes-1.png border="1" width="640px") ![Woman Ball](./gallery/ehayes-2.png border="1" width="640px") ![Into the Wormhole](./gallery/ehayes-3.png border="1" width="640px") ![Speedy McGee](./gallery/ehayes-4.png border="1" width="640px") **ehayes**: Here we introduce the never-before-seen Hayes SphereWarp! For each pixel in the image we determine a scale factor (distance from center divided by radius of a circle inscribed in the image). Then, we shift each pixel horizontally by an amount weighted by a linear combination of its scaling factor, the input value from the user, and an arbitrary fun number (650). ----- ![**kjfeng**: This filter was inspired by laser cutters: it's supposed to represent how an image is supposed to look when it's laser cut onto a piece of black opaque material (such as acrylic). Here I'm mimicking a laser cutter capable of 3 "colours" - white (full etch), black (no etch) and gray (light etch for shading). The custom filter iterates through every pixel coordinate (x,y) in the image, gets the pixel at that coordinate, and converts it to the HSL colourspace. This allows an easy check for luminance, which is what I'm using to determine what colour the pixel should change into. If the luminance is smaller than the value of the function's 'value' parameter, set the pixel to white. If the pixel's luminance is between 1 and 2 times the value of the function's 'value' parameter, set it to gray. Otherwise set the pixel to white. Place the pixel on the image at (x,y). I've also added a red "sun" using the brush tool to go along with the image I uploaded and modified because I thought it was a nice touch to the overall look :) ](./gallery/kjfeng.jpg border="1" width="640px") ----- ![**mew2**: To produce this image, I wrote a custom filter that generated random points in polar space, which I used to apply the soft-brush effect. That is, for each random point generated, the radius of the resulting softbrush was proportional to the radius of the point (its distance from the center of the image), as was its saturation, and its hue was determined by the point's theta. I kept the luminance constant at 0.5. Thus we achieve the effect of random softbrushes growing out from the center but forming fragments of the color wheel. ](./gallery/mew2.png border="1" width="640px") ----- ![](./gallery/uuberoy-1.png border="1" width="640px") ![](./gallery/uuberoy-2.png border="1" width="640px") ![](./gallery/uuberoy-3.png border="1" width="640px") ![](./gallery/uuberoy-4.png border="1" width="640px") ![](./gallery/uuberoy-5.png border="1" width="640px") **uuberoy**: For the custom filter, I started off wanting to implement a mosaic-style filter that divided the image into smaller squares, selected the center pixel of each square, and set the color of every other pixel in the square to the color of the center square. This was fairly straightforward to implement, and the resulting solid colors of each square gave the overall image a flat look. To expand on my initial implementation, I thought it would be interesting to use alpha blending in each square to fill it in, to eliminate some of the flatness. Doing so gave my image greater depth, but the resulting circles in each square made it easy to tell how I had implemented it. In the last iteration of my design for the filter, I decided to expand the range of the pixels that I colored for each square center. Instead of restricting the coloring to each square, I now colored halway into each left and right square as well. This resulted in an interesting overlap of colors and the effect of fragmentation. ----- ![](./gallery/wsweeny-1.png border="1" width="640px") ![](./gallery/wsweeny-2.png border="1" width="640px") ![](./gallery/wsweeny-3.png border="1" width="640px") **wsweeny**: [TA note: This student implemented a variety of custom filters including image warping, HSL modifications, thresholding, mosaicing, and more, and combined their various filters in interesting ways to produce numerous art contest submissions. A small selection of their results are shown above.] Runner-ups (+1.5 points) =============================== ![**ahelman**: For my Custom Filter, I was inspired by the idea of 4-bit quantization discussed in lecture. I iterate over every pixel in the image, calculate its luminance from its RGB values, and then set the pixel to one of four colors (black, blue, green, or red) depending on what range the luminance falls into, ([0, .25), [.25, .5), [.5, .75), or [.75, 1], respectively).](./gallery/ahelman.png border="1" width="640px") ----- ![**ajayp**: This custom filter performs a swirl by rotating the image by decreasing amounts as you extend away from the center](./gallery/ajayp.png border="1" width="640px") ----- ![](./gallery/ajm7-1.png border="1" width="640px") ![](./gallery/ajm7-2.png border="1" width="640px") ![](./gallery/ajm7-3.png border="1" width="640px") **ajm7**: This custom filter produces smears on the image. Points are chosen randomly and their color is alpha blended with the rest of the column. The function value defines how low on the image the filter starts selecting points. ----- ![](./gallery/atgao-1.png border="1" width="640px") ![](./gallery/atgao-2.png border="1" width="640px") **atgao**: Going through the image pixel by pixel, I calculated an HSL color based on the ratio between a given pixel to the center and the radius. The radius was scaled by a favtor determined by the value and the saturation was also determined by the given value. I then converted the pixel into rgb and set the pixel, creating a rainbow gradient frame that could be adjusted by the user. ----- ![Input parameter of 0.3](./gallery/cwkchan-1.png border="1" width="640px") ![Input parameter of 0.7](./gallery/cwkchan-2.png border="1" width="640px") **cwkchan**: For my custom filter, I adjusted the color of the images so that each RGB value is affected by the "next" value (so that the red value takes on the value of the green value as the input value approaches 1, and similarly, the green value becomes the blue value, and the blue value becomes the red value). ----- ![](./gallery/jcabanas-1.png border="1" width="640px") ![](./gallery/jcabanas-2.png border="1" width="640px") **jcabanas**: My custom filter deconstructs each channel into its R, G, B channels. I then use each R, G, B component of the input pixel to construct each output channel. My output channels are calculated as follows (where i and j are pixel coordinates): R' = R*value*(i/image.width) + G*(1-value)*(j/image.height) + B*((i+j)/(image.width+image.height)) G' = R*(1-value)*(i/image.width) + G*(j/image.height) + B*value*((i+j)/(image.width+image.height)) B' = R*(i/image.width) + G*value*(j/image.height) + B*(1-value)*((i+j)/(image.width+image.height)) These formulas are intended to translate pixel colors depending on the input color value and spatial position. The result of this filter is a color gradient across the image. To maintain reasonable brightness across the image, each channel is normalized by a factor of (2*(((i/image.width)/2) + ((j/image.height)/2))). ----- ![**jlouthan**: I temporarily overwrote the brush implementation with a new one that uses the same circle as the regular brush, but randomly scrambles the pixels within each circle instead of filling them all the same color. To create the art above, I applied this temporary brush filter with a small radius (~4) to color in the doge's head, then slowly increased the radius to further scramble all the pixels with each other as the circles began to overlap, and I created a gif using the images generated by many different brush radii.](./gallery/jlouthan.gif border="1" width="640px") ----- ![](./gallery/junep-1.jpg border="1" width="640px") ![](./gallery/junep-2.jpg border="1" width="640px") ![](./gallery/junep-3.jpg border="1" width="640px") **junep**: I first draw a gradient of white to black in the background to create an extra sense of lighting, and then uniformly draw circles of a certain radius based on the value. The center of the circle determined the color of the circle. I also drew a sun using the soft brush, it seemed to make sense. ----- ![**kjeon**: This custom filter picks a certain number of coordinates (currently set to width * height / 50) randomly, at which point the soft brush is applied with radius 15. The resulting effect looks a bit like looking at an image through a bit of textured glass. The soft brush strokes are applied iteratively, so a blurring effect is achieved.](./gallery/kjeon.jpg border="1" width="640px") ----- ![](./gallery/kyleaj-1.png border="1" width="640px") ![](./gallery/kyleaj-2.png border="1" width="640px") ![](./gallery/kyleaj-3.png border="1" width="640px") **kyleaj**: To achieve the effect above, I first blur the image with a 5x5 box blur. I then subtract this blurred image from the original image. This has the effect of subtracting higher level details, leaving only the fine or sharp details of the image. However, the resultant image is a bit dark. To fix this, I convert the colors HSL, increase the luminance by taking the square root of the current value, and then convert the color back to RGB. This leaves the background a little messy (which in itself is a cool effect), so I decided to only take the square root when the luminance is greater than 0.03. 0.03 was determined experimentally. The result has the style of a neon sign. The included pictures are, in order, the final result, the result without thresholding, and the immediate result after subtracting the blurred image. ----- ![**lmeng**: I was particularly inspired by the soft brush and wanted to challenge myself to see if I could create an full artwork with different components purely by varying the soft brush's radius and alpha_at_center. The galaxy background was created with large radii and lower alpha_at_center, while the stars used a much smaller radius and high alpha_at_center.](./gallery/lmeng.jpg border="1" width="640px") ----- ![Convolve once](./gallery/narekg-1.png border="1" width="640px") ![Convolve twice](./gallery/narekg-2.png border="1" width="640px") ![Convolve ten times](./gallery/narekg-3.png border="1" width="640px") ![Convolve ten times](./gallery/narekg-4.png border="1" width="640px") **narekg**: For the Art Contest I implemented a couple of convolution filters and played with convolving different channel combinations of the images. What I sattled on is bluring saturation channel and sharpening luminosity channel of an image's pixels in HSL space. When doing this around 10 times, images look like dithered and some of them resamble optical illusions with hidden patterns in them that you see after staring at them for a couple of seconds. When doing this over and over again luminosity channel becomes binary and saturation channel convolution no longer matters but it creates interesting shades before we get to this extreme. ----- ![Original image](./gallery/rb25-1.jpg border="1" width="640px") ![Filtered image](./gallery/rb25-2.png border="1" width="640px") **rb25**: The custom filter selects a random pixel within 1/10 the width in the x direction and 1/10 the height in the y direction for each pixel. It alpha blends the selected pixel with the pixel of interest. The filter repeats this process 5 times for the image. -----