OpenCV Python 图像抖动处理

4

我用Python编写了一段图像抖动代码,对于一些图片来说运行良好,但是对于某些图片,在白色区域生成了不必要的颜色。

#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)

附上参考图片...在这里输入图片描述 如何消除右上角区域的大圆点...

谢谢。

1个回答

3

出现这些斑点是因为整数溢出。 cv2.imread()使用无符号8位整数(请参见numpy.uint8)表示图像,其最大值为255,如果超过该值,则从零重新开始。例如:255 + 50 = 49。在您的代码中添加错误时会发生这种情况。

有几种方法可以避免这种情况。最简单的方法是确保您的值不超过255。


2
谢谢@Roman,它起作用了,现在图片看起来更好了。 - Bharath Kotari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接