DEV Community

Cover image for Detecting missing pixels in an Image
Zephaniah Joshua
Zephaniah Joshua

Posted on • Updated on

Detecting missing pixels in an Image

Today we will be talking about finding missing data from the image we sent over the network. From our previous example of sending an image over a network, we are going to check if any pixels were lost during the transfer

First off we will try to map out an algorithm for detecting an error in the image file.

Receive a pixel
Store position of the pixel
Receive the next
Check if the pixels are in the correct order i.e pixel1, pixel2
If they are not then there is a missing pixel
Get the position of the missing pixel
Continue this 6 steps repeatedly until the image is sent
Send a request for missing pixels
Open image
And insert missing pixels into their position
Because we are transferring images on the same machine I induced an error by skipping any pixel with an odd Y value.

This is the code that sends the image

from socket import *
from pickle import *
from PIL import Image
import time

#create a socket

sockfd = socket(AF_INET, SOCK_DGRAM)

#open image
image = Image.open("100kb.png")

#get image size
width, height = image.size
print(image.size)

for x in range(width):
    for y in range(height):

        #get the position in the two dimensional array
        try:
            pos = (x, y)
            rgba = image.getpixel(pos)

            message = (pos, rgba)
            if y % 2 == 0:
                msg = dumps(message)
                sockfd.sendto(msg, ("127.0.0.1", 9916))
            #time.sleep(0.001)
        except:
            print(1)
message = "done"
msg = dumps(message)
sockfd.sendto(msg, ("127.0.0.1", 9916))

def send_missing_pixel():
    while True:
        msg, cli_addr = sockfd.recvfrom(1024)
        pos = loads(msg)
        if pos == "done":
            break
        rgba = image.getpixel(pos)
        data = (pos, rgba)
        data = dumps(data)
        sockfd.sendto(data, cli_addr)
        print("eggs")


send_missing_pixel()

Enter fullscreen mode Exit fullscreen mode

The first image sent
Alt Text

Code to receive the image and ask for missing pixels

from socket import *
from pickle import *
from PIL import Image 
import time



#viewer = ImageViewer()
sockfd = socket(AF_INET, SOCK_DGRAM)
sockfd.bind(("127.0.0.1", 9916))

height = 170
width = 272
isize = (height, width)
#image = open("image2.png", "x")
image4 = Image.new("RGBA", size=(width, height))
pixels = image4.load()
#the following variables for storing positions of missing pixels
error_pos = []
pos1 = None
x = []
y = []

def get_pixel_data():
    j = 0
    x1 = []
    e_count = 0
    #erro counter
    error_count = 0
    while True:
        j = j + 1
        msg, cli_addr = sockfd.recvfrom(1024)
        #decoding 
        message = loads(msg)
        if message == "done":
            image4.save("image3.png")
            break
        pos = message[0]
        rgba = message[1]
        #print(pos)
        #setting pixels into image file
        pixels[pos[0], pos[1]] = rgba
        #stroing postitions to check if there is a missing pixel
        xy = (pos[0], pos[1]) 
        #print(xy)
        x1.append(xy)
        try:
            s = j - 1
            #print(x1[_s])
            if len(x1) > 1:
                #checking difference betwwen previous coordinates and present coordinates 
                xnums = x1[s][0] - x1[s-1][0]
                ynums = x1[s][1] - x1[s-1][1]
                #this will check if the difference Y returns a negative
                #that means a new X value and recalculate the Y value
                if ynums < 0:
                    ynums = height - x1[s-1][1] + x1[s][1]
                #iterate through the difference and create a list of missing pixel positions
                if ynums > 1:
                    for i in range(1, ynums):
                        if xnums > 1:

                            un = x1[s][0] + i
                            x.append(un)                        
                        if xnums <= 1:
                            e = x1[s][0]
                            x.append(e)
                        un = x1[s][1] + i
                        y.append(un)
                        _c = (x[e_count], y[e_count])
                        error_pos.append(_c)
                        e_count = e_count + 1
        except:
            pass

    q = len(error_pos)
    j1 = width * height
    #print(q , e_count)
    if e_count == q:
        #print(123)
        get_missing_data(cli_addr)


def get_missing_data(cli_addr):
    _x = len(error_pos)
image5 = Image.open("image3.png")
    for i in range(_x):
        e_pos = error_pos[i]
        msg = dumps(e_pos)
        sockfd.sendto(msg, cli_addr)
        #time.sleep(0.001)
        msg, cli_addr = sockfd.recvfrom(1024)
        #decoding 
        message = loads(msg)
        pos = message[0]
        rgba = message[1]
        pixels = image5.load()
        pixels[pos[0], pos[1]] = rgba
        print(pixels[pos[0], pos[1]])
    image5.save("image3.png")
    x = "done"
    msg = dumps(x)
    sockfd.sendto(msg, cli_addr)

get_pixel_data()



Enter fullscreen mode Exit fullscreen mode

Halfway into correcting image
Alt Text

complete Image
Alt Text

Photo by Umberto on Unsplash

leave a comment, suggestion or contact me @black_strok3

Top comments (0)