Replicating Photoshop's dithering in Python

New Here ,
Jul 20, 2022 Jul 20, 2022

Copy link to clipboard

Copied

I want to do the same dithering that Photoshop does in its Save for Web export section. This is my original image: Original image

Diffusion dithering in Photoshop using the following settings:

Photoshop Save for Web account 

This yields the following image: Photoshop dithering

In Python, I'm using PIL's Image.convert() function with Adaptive color reduction and Floyd-Steinberg algorithm for diffusion dithering. The problem is that Python produces a slightly different dithered image (as shown in the retrieved palette below). The image produced by Python is this: Python dithering

This is my code

from PIL import Image
MyImageTrueColor = Image.open('vijnbjz_2K_Albedo.jpg')

MyImageDithered = MyImageTrueColor.convert(mode='P',
    colors=64,
    dither=1,
    palette = 1
    )

MyImageDithered.save('dithered.gif')
im2 = MyImageDithered.getpalette()

dithered = []
for i in im2:
    if i != 0:
        dithered.append(i)

palette = []

for i in range(len(dithered)):
    if (i % 3) == 2:
        palette.append(tuple(im2[i - 2:i + 1]))

print("Palette from Python:")
print(len(palette))
print(palette)

print("\n Palette from Photoshop:")

a = Image.open("industrial_storage.gif")
b = a.getpalette()

palette = []

for i in range(len(b)):
    if (i % 3) == 2:
        palette.append(tuple(b[i - 2:i + 1]))

print(len(palette))
print(palette)

Output:

Palette from Python:
64
[(185, 183, 178), (167, 166, 161), (160, 157, 151), (151, 153, 152), (150, 145, 138), (143, 143, 139), (138, 141, 142), (136, 137, 135), (138, 131, 122), (132, 130, 125), (129, 131, 129), (128, 125, 118), (125, 128, 126), (124, 123, 118), (120, 125, 126), (119, 122, 121), (129, 117, 102), (123, 117, 107), (121, 117, 109), (120, 119, 115), (119, 113, 104), (116, 119, 118), (117, 116, 110), (116, 113, 107), (116, 110, 99), (112, 117, 120), (113, 115, 111), (112, 112, 109), (112, 110, 106), (112, 109, 101), (108, 112, 112), (108, 108, 104), (104, 110, 111), (118, 103, 85), (111, 104, 93), (108, 106, 100), (108, 102, 90), (105, 107, 104), (104, 104, 101), (105, 103, 95), (104, 98, 87), (100, 105, 107), (101, 103, 100), (100, 100, 97), (100, 98, 89), (96, 101, 102), (96, 97, 93), (92, 98, 99), (110, 91, 68), (100, 92, 79), (94, 94, 89), (95, 90, 78), (91, 93, 92), (90, 89, 82), (87, 90, 88), (83, 88, 89), (101, 81, 59), (89, 81, 70), (83, 81, 75), (76, 79, 77), (90, 68, 47), (86, 56, 34), (71, 65, 57), (66, 46, 30)]

 Palette from Photoshop:
64
[(119, 120, 118), (98, 74, 49), (134, 122, 109), (80, 53, 32), (87, 88, 86), (102, 99, 88), (100, 89, 76), (118, 115, 106), (136, 136, 135), (175, 174, 171), (136, 132, 121), (152, 153, 151), (87, 83, 72), (115, 107, 102), (54, 37, 23), (116, 105, 87), (107, 115, 117), (90, 99, 100), (169, 164, 155), (72, 71, 67), (151, 148, 139), (107, 107, 98), (123, 132, 134), (167, 155, 142), (104, 107, 115), (107, 107, 107), (218, 213, 205), (119, 123, 132), (99, 99, 99), (121, 96, 63), (149, 140, 132), (83, 74, 64), (87, 90, 99), (99, 107, 107), (140, 148, 150), (74, 82, 84), (136, 140, 148), (192, 185, 176), (203, 197, 188), (90, 99, 90), (107, 115, 107), (107, 94, 67), (99, 107, 99), (153, 156, 165), (99, 99, 107), (128, 114, 87), (163, 165, 165), (107, 99, 99), (123, 132, 123), (72, 74, 82), (56, 67, 70), (74, 82, 74), (48, 53, 57), (140, 148, 140), (65, 62, 52), (156, 165, 156), (182, 185, 191), (197, 199, 199), (115, 107, 115), (188, 190, 188), (132, 123, 123), (107, 99, 107), (148, 140, 148), (99, 90, 90)]

Anyone know how I can get accurate results in Python by using alternative code or any other algorithm other than Floyd-Steinberg dithering?

TOPICS
Problem or error

Views

25

Likes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
no replies

Have something to add?

Join the conversation