There is a ghost image (not sure if that is the right term) on my e-ink display from waveshare:

enter image description here

Is there any way I can fix this, or do I have to replace the display?

The ghosting appeared after several days of use and I think it appeared because I didn't put the display to sleep after updating it. Can anyone confirm that adding the .sleep() call would prevent this to happend again?

    import epd2in13

    def showImageOnScreen(image):
        epd = epd2in13.EPD()
        epd.set_frame_memory(image, 0, 0)
  • What do you mean? An e-ink display doesn't suffer from the burn-in effect common to old CRT type displays.
    – joan
    Feb 12, 2020 at 22:00
  • Sorry, my image wasn't uploaded the first time, you can see on the picture that the screen doesn't get properly refreshed, there is always something from the previous image that stays. I tried to reset but it didn't help. I think it was damaged because I didn't put in sleep after updating and it was under high voltage for an extended period of time.
    – Robin
    Feb 13, 2020 at 13:00

2 Answers 2


To stop this happening you need to run a 'scrub' cycle frequently. Each day (well early morning) I run a cron job that sets all the pixels red, then black then white (I have the Pimoroni display) including the display frame / edge.

My code is based around their support library but should give you a basic idea:

class InkyScreen:

    def __init__(self, Colour, Rotate = 0, Size = (212, 104)):

        if Colour.upper() not in ['RED', 'YELLOW', 'BLACK']:
            Colour = 'RED'
        if Rotate not in [0, 90, 180, 270]:
            Rotate = 0
        if Size not in [(212, 104), (104, 212), (400, 300) , (300, 400)]:
            Size = (212, 104)

        self.colour = Colour
        self.border = Colour
        self.rotate = Rotate
        self.image_obj = Image.new('P', Size)
        self.screen_image = ImageDraw.Draw(self.image_obj)
        self.width = Size[0]
        self.height = Size[1]
        self.dev = InkyPHAT(Colour)

    def clear(self, Colour = InkyPHAT.WHITE, Border = InkyPHAT.WHITE):

        self.screen_image.rectangle([(0 ,0), (self.width, self.height)], \
                            fill = Colour, \
                            outline = None )
        self.border = Border

    def show(self):


    def scrub(self,cycles = 3):

        colours = [InkyPHAT.RED, InkyPHAT.BLACK, InkyPHAT.WHITE]
        for i in range(cycles):
            for index, colour in enumerate(colours):
                self.clear(Colour = colour, Border = colour)

As your screen has been 'set' for a while, you may want to add a delay of a minute or so between each colour change and run the scrub a few times while checking on it.

The cause is due to the discharge not being complete and leaving some cells 'stuck' in part charged states - hence the ghost image.


The recommended procedure preventing ghost images on e-ink is to fill the display with 100% black, then 100% white, then display the target image:

enter image description here

If this is what you already do, then you just got a low-quality display.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.