0
from PIL import Image
import sys

infile1 = Image.open(sys.argv[1])
infile2 = Image.open(sys.argv[2])
infile3 = Image.open(sys.argv[3])
infile4 = Image.open(sys.argv[4])

outfile1 = Image.new('1', infile1.size)
outfile2 = Image.new('1', infile1.size)
outfile3 = Image.new('1', infile1.size)

for x in range(infile1.size[0]):
    for y in range(infile1.size[1]):
        outfile1.putpixel((x, y), max(infile1.getpixel((x, y)), infile2.getpixel((x, y))))
        outfile2.putpixel((x, y), max(infile3.getpixel((x, y)), infile4.getpixel((x, y))))
        outfile3.putpixel((x, y), max(outfile1.getpixel((x, y)), outfile2.getpixel((x, y))))


outfile1.save('result.png')

infile1, infile2, infile3 and infile4 are png images that are given as input. These .png files are the output of a visual cryptography scheme where one input image is split into 4 different images (shares). you can find it here: http://www.datagenetics.com/blog/november32013/index.html

While splitting the original image into 4 shares

for x in range(0, image.size[0]):
    for y in range(0, image.size[1]):
    sourcepixel = image.getpixel((x, y))
    print sourcepixel
    assert sourcepixel in (0, 255)
    coinflip = random.random()
    #coinflip = 0.6
    print coinflip
    if sourcepixel == 0: #if it's black
        if coinflip < .5:
            print "black pixel with less than 0.5"
            #arrangement 1
            #black, white, white top row [(0,0),(1,0),(2,)]
            share1.putpixel((x * 2, y * 2), 0)
            share1.putpixel((x * 2 + 1, y * 2 ), 255)
            share1.putpixel((x * 2 + 2, y * 2 ), 255)

            #black,black,black mid row
            share1.putpixel((x * 2, y * 2 + 1), 0)
            share1.putpixel((x * 2 + 1, y * 2 + 1), 0)
            share1.putpixel((x * 2 + 2, y * 2 + 1), 0)

            #white, black, white bottom row
            share1.putpixel((x * 2, y * 2 + 2), 255)
            share1.putpixel((x * 2 + 1, y * 2 + 2), 0 )
            share1.putpixel((x * 2 + 2, y * 2 + 2), 255)

            #arrangement 2
            #white,black,white
            share2.putpixel((x * 2, y * 2), 255)
            share2.putpixel((x * 2 + 1, y * 2 ), 0)
            share2.putpixel((x * 2 + 2, y * 2 ), 255)

            #black,black,white
            share2.putpixel((x * 2, y * 2 + 1), 0)
            share2.putpixel((x * 2 + 1, y * 2 + 1), 0)
            share2.putpixel((x * 2 + 2, y * 2 + 1), 255)

            #black,black,white
            share2.putpixel((x * 2, y * 2 + 2), 0)
            share2.putpixel((x * 2 + 1, y * 2 + 2), 0 )
            share2.putpixel((x * 2 + 2, y * 2 + 2), 255)

        else:
            #arrangement 3
            #white,black,white
            share3.putpixel((x * 2, y * 2), 255)
            share3.putpixel((x * 2 + 1, y * 2 ), 0)
            share3.putpixel((x * 2 + 2, y * 2 ), 255)

            #black,black,black
            share3.putpixel((x * 2, y * 2 + 1), 0)
            share3.putpixel((x * 2 + 1, y * 2 + 1), 0)
            share3.putpixel((x * 2 + 2, y * 2 + 1), 0)

            #white,white,black
            share3.putpixel((x * 2, y * 2 + 2), 255)
            share3.putpixel((x * 2 + 1, y * 2 + 2), 255)
            share3.putpixel((x * 2 + 2, y * 2 + 2), 0)

            #arrangement 4
            #white,black,black
            share4.putpixel((x * 2, y * 2), 255)
            share4.putpixel((x * 2 + 1, y * 2 ), 0)
            share4.putpixel((x * 2 + 2, y * 2 ), 0)

            #white,black,black
            share4.putpixel((x * 2, y * 2 + 1), 255)
            share4.putpixel((x * 2 + 1, y * 2 + 1), 0)
            share4.putpixel((x * 2 + 2, y * 2 + 1), 0)

            #white,black,white
            share4.putpixel((x * 2, y * 2 + 2), 255)
            share4.putpixel((x * 2 + 1, y * 2 + 2), 0)
            share4.putpixel((x * 2 + 2, y * 2 + 2), 255)

    elif sourcepixel == 255: # if it's white
        if coinflip < .5:
            print "white pixel with less than 0.5"
            #arrangement 1
            #white, white, white top row [(0,0),(1,0),(2,)]
            share1.putpixel((x * 2, y * 2), 255)
            share1.putpixel((x * 2 + 1, y * 2 ), 255)
            share1.putpixel((x * 2 + 2, y * 2 ), 255)

            #black,black,black mid row
            share1.putpixel((x * 2, y * 2 + 1), 0)
            share1.putpixel((x * 2 + 1, y * 2 + 1), 0)
            share1.putpixel((x * 2 + 2, y * 2 + 1), 0)

            #black, black, white bottom row
            share1.putpixel((x * 2, y * 2 + 2), 0)
            share1.putpixel((x * 2 + 1, y * 2 + 2), 0 )
            share1.putpixel((x * 2 + 2, y * 2 + 2), 255)

            #arrangement 2
            #white,black,white
            share2.putpixel((x * 2, y * 2), 255)
            share2.putpixel((x * 2 + 1, y * 2 ), 255)
            share2.putpixel((x * 2 + 2, y * 2 ), 0)

            #black,black,white
            share2.putpixel((x * 2, y * 2 + 1), 0)
            share2.putpixel((x * 2 + 1, y * 2 + 1), 0)
            share2.putpixel((x * 2 + 2, y * 2 + 1), 255)

            #black,white,black
            share2.putpixel((x * 2, y * 2 + 2), 0)
            share2.putpixel((x * 2 + 1, y * 2 + 2), 255 )
            share2.putpixel((x * 2 + 2, y * 2 + 2), 0)

        else:
            #arrangement 3
            #white,black,white
            share3.putpixel((x * 2, y * 2), 255)
            share3.putpixel((x * 2 + 1, y * 2 ), 0)
            share3.putpixel((x * 2 + 2, y * 2 ), 255)

            #black,black,white
            share3.putpixel((x * 2, y * 2 + 1), 0)
            share3.putpixel((x * 2 + 1, y * 2 + 1), 0)
            share3.putpixel((x * 2 + 2, y * 2 + 1), 255)

            #white,black,black
            share3.putpixel((x * 2, y * 2 + 2), 255)
            share3.putpixel((x * 2 + 1, y * 2 + 2), 0)
            share3.putpixel((x * 2 + 2, y * 2 + 2), 0)

            #arrangement 4
            #white,black,black
            share4.putpixel((x * 2, y * 2), 255)
            share4.putpixel((x * 2 + 1, y * 2 ), 0)
            share4.putpixel((x * 2 + 2, y * 2 ), 0)

            #black,black,black
            share4.putpixel((x * 2, y * 2 + 1), 0)
            share4.putpixel((x * 2 + 1, y * 2 + 1), 0)
            share4.putpixel((x * 2 + 2, y * 2 + 1), 0)

            #white,white,white
            share4.putpixel((x * 2, y * 2 + 2), 255)
            share4.putpixel((x * 2 + 1, y * 2 + 2), 255)
            share4.putpixel((x * 2 + 2, y * 2 + 2), 255)

share1.save('share1.png')
share2.save('share2.png')
share3.save('share3.png')
share4.save('share4.png')

I created a simple testfile.png in paintbrush, a white background with some black shapes on it. The shares are divided, often leaving more information on 2 shares than the others.

On combining these shares however, the result file doesn't look anything like the original image. Any suggestions on how to test if the shares are made fine, and if they are then how would i combine them (over lay them so that the original image is returned) ?

baconSoda
  • 503
  • 2
  • 5
  • 15
  • Check [THIS PAGE](http://stackoverflow.com/questions/41376337/applying-overlays-to-image-with-varying-transparency/41381887#41381887) where I have posted an answer using OpenCV. Try replicating it using `pillow`. – Jeru Luke Jan 02 '17 at 15:12
  • Also read [THIS POST](http://www.pyimagesearch.com/2016/03/07/transparent-overlays-with-opencv/) for more details using OpenCV. – Jeru Luke Jan 02 '17 at 15:14

0 Answers0