i wrote a code for image dithering in python , it is working well for some images but for some it is generating unnecessary colors in the white regions .
#IMAGE DITHERING BASED ON Floyd-Steinberg METHOD
#author : bharath kotari
#date :18-1-2018
import cv2
import numpy as np
def set_pixel(im,x,y,new):
im[x,y]=new
def quantize(im):
for y in range(0,height-1):
for x in range(1,width-1):
old_pixel=im[x,y]
if old_pixel<127:
new_pixel=0
else:
new_pixel=255
set_pixel(im,x,y,new_pixel)
quant_err=old_pixel-new_pixel
set_pixel(im,x+1,y,im[x+1,y]+quant_err*w1)
set_pixel(im,x-1,y+1, im[x-1,y+1] + quant_err*w2 )
set_pixel(im,x,y+1, im[x,y+1] + quant_err * w3 )
set_pixel(im,x+1,y+1, im[x+1,y+1] + quant_err * w4 )
return im
img=cv2.imread("/home/user/Downloads/blender_images/truck.jpg")
gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img2=img.copy()
width,height,z=img.shape
w1=7/16.0
#print w1
w2=3/16.0
w3=5/16.0
w4=1/16.0
blue=img[:,:,0]
blue=quantize(blue)
green=img[:,:,1]
green=quantize(green)
red=img[:,:,2]
red=quantize(red)
gray1= quantize(gray)
image = cv2.merge((blue, green, red))
cv2.imshow('original',img2)
cv2.imshow('merged',image)
cv2.imshow('gray',gray1)
cv2.waitKey(0)
attaching image for reference ..
how to eliminate those big dots in the top right region ..
thankYou.
The spots happen because of integer overflow. cv2.imread() represents image using unsigned 8 bit integer (see numpy.uint8), which have a max value of 255 and start over from zero if that value is passed. For example: 255 + 50 = 49. This happen in your code when adding in the errors.
There are several methods to avoid this. The simplest would be to make sure your values don't go over 255.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With