High quality render of wedding photos


Please zoom in and look at the fine details.

This image was generated from the same image used in Noise Wedding. The main improvement is instead of rearranging colours in 128 continuous pixel blocks. Colours here are randomly scheduled (shuffled) and then blocks of these shuffled Colours are taken and then swapped. We used a block-size of 32. This image took probably 60 hours because we ran iterated over it 30 times.

Step 1: make a random image of all Colours

Step 2: make a random pixel schedule

Step 4: for each N (32) pixels of the schedule

Step 4.1: use Munrkes/Hungarian method to find the best permutation of these 32 randomly placed noise pixels from the random image that has the minimum the colour distance to the input image. Use YUV colour distance and use a 4X multiplier on the Y difference.

Step 4.2: Once we have the minimum permutation, swap/permute those pixels as per the calculation

Step 5: optionally take this output image and input back as the "random image" in step 2

So what's important here? We use YUV colour distance instead of RGB colour distance. I did tests and I found RGB colour distance resulted in "brighter" results but the colours were off and it make people in the photos look like clowns. YUV focused on perceptual qualities, such as luminance, and therefore is better for an image that estimates another one. The main difference between his picture and the original photo is the tints in this photo are off, and her arm in the top left is not actually green.

Another detail I want you to be aware of, zoom in, view this image 4096x4096. Go look at her dress, go look at the woodwork on the wall. Go look at the dorky little birdy in the cage. See how the detail at the pixel level is very clean and clear, there is not a lot of extraneous noise. The error has not been shuffled down to this detail. This method has preserved fine grained details and the picture looks like the original regardless of zoom level.

* Took ~60 hrs

* High quality render (details are in tact)

* YUV colour distance used (I am experimenting with YCrBr colour distance and not finding much improved performance)

* 32 pixels were randomly chosen optimally permutated at the same time, compared using YUV colour distance

Q: what if you used 2 pixel swapping?
A: If you 2 pixel swapping and repeat 30 times the results are quite acceptable but there is a lot of noise in the details stiff, but it is often good enough (also it runs in less than 30 minutes if you do 2 pixel swapping). 8 pixel permutations are much higher quality.

Q: Why 32 pixel blocks?
A: Because 128 pixel blocks take 45 hrs per image and 8 pixel blocks take less 20 minutes. Remember I repeated this 30 times. 32 pixel blocks take over an hour per iteration. Munrkes is O(N^3)

Source code:

Git: git clone



3 entries


Dimensions4,096 × 4,096