Posterize: https://docs.gimp.org/2.10/en/gimp-filter-posterize.html https://www.google.com/search?q=Posterize&tbm=isch Last year my wife wanted to posterize some photos to make street graffiti. She tried like 5 online and offline versions and got bad results. I tried a few more and also got bad results. So she pick the best one and made a lot of manual corrections. It looks like a hard problem.
Dither: https://docs.gimp.org/2.10/en/gimp-filter-dither.html https://www.google.com/search?q=Dither&tbm=isch I used this a long time ago and got good results, but it was a long time ago so I may be misremembering.
---
A long time ago someone told me about how to calibrate a printer system . IIRC yuo get an image in the computer and a printer version with a bunch of colors. Then you print the image and scan the original and the new version. Then the software compare both, and make some corrections. Now you repeat the process a few times, until the image you print is equal to the image you got initially. I'm not sure if the systems assumes to many details that are specific for the printer.
---
IIUC one of the problems is that the CMYK in the computer is very different from the CMYK you get in the fabric. Perhaps you can print in paper using normal ink a version of https://www.google.com/search?q=color+tv+calibration&tbm=isc... and then print the same image in the fabric using sublimation. Then scan both and compare them. Perhaps make a custom image with a lot of small squares to cover all the CMYK space, like
{00, 40, 80, C0, FF} x {00, 40, 80, C0, FF} x {00, 40, 80, C0, FF} x {00, 40, 80, C0, FF}
because I remember that FFFFFF00 is a horrible dark brown color and 000000FF is a nice black color, but TV doesn't care about that detail.
Perhaps print multiple images, to sample more points in the the CYMK space. As many as possible without making everyone hate you.
So now you have two functions, F and G:
F(CMYK_computer) = CMYK_paper
G(CMYK_computer) = CMYK_fabic
and you want a third function H that convert the initial CMYK color into a fake CMYK color that printed in the fabric is equal to the result of the initial one in paper.
H(CMYK_computer) = CMYK_fake
G(CMYK_fake) = CMYK_paper
G(H(CMYK_computer) = F(CMYK_computer)
so H is defined as
H(CMYK_computer)=invG(F(CMYK_computer))
Calculating the inverse of G may be difficult, but my guess is that interpolation or machine learning should solve the problem. Also, the inverse of G may not be defined in some cases, so you should add some clipping to avoid raising an error.
It looks like an interesting problem (not easy, but not impossible).