抖动算法简单介绍 简单说就是牺牲分辨率来提高颜色数量。 通过黑点的疏密程度来进行灰度的显示。 例如墨水屏幕只能显示黑白,那么我们可以取样一部分区域矩,例如2x2的一个矩阵
抖动算法简单介绍
简单说就是牺牲分辨率来提高颜色数量。
通过黑点的疏密程度来进行灰度的显示。
例如墨水屏幕只能显示黑白,那么我们可以取样一部分区域矩,例如2x2的一个矩阵,来显示5个级别的灰度,用4个像素当成一个像素来看,就会有5个级别的灰度。
通过这种方法就可以牺牲掉一半的分辨率(其实是1/4),来显示出5个级别的灰度,当然如果扩大取样矩阵可以获得更多级别的灰度,同时也有牺牲很大的分辨率。
取样的矩阵为nxn,显示颜色灰度的级别一共有 (nxn+1),那么正常的灰度级别为256级,也就是最大取样16x16的矩阵就够用了。
代码实现
import cv2import numpy as np
import sys
img = cv2.imread("input.jpg",0)
height,width = img.shape
if height % 2 != 0:
height -= 1
if width % 2 != 0:
width -= 1
if height > width:
img=np.rot90(img)
height,width = width,height
k_size = 2
def change(gray,img):
step = int(255/(k_size*k_size+1))
k1 = range(0,step)
k2 = range(step,2*step)
k3 = range(2*step,3*step)
k4 = range(3*step,4*step)
k5 = range(4*step,255+1)
if gray in k1:
img[0][0] = 0
img[0][1] = 0
img[1][0] = 0
img[1][1] = 0
if gray in k2:
img[0][0] = 0
img[0][1] = 0
img[1][0] = 255
img[1][1] = 0
if gray in k3:
img[0][0] = 0
img[0][1] = 255
img[1][0] = 255
img[1][1] = 0
if gray in k4:
img[0][0] = 0
img[0][1] = 255
img[1][0] = 255
img[1][1] = 255
if gray in k5:
img[0][0] = 255
img[0][1] = 255
img[1][0] = 255
img[1][1] = 255
for h in range(0,height,k_size):
for w in range(0,width,k_size):
gray = int(sum([img[h][w],img[h][w+1],img[h+1][w],img[h+1][w+1]])/(k_size*k_size)) # 计算2x2矩阵中灰度平均值
temp = img[h:h+2,w:w+2] # 取样
change(gray,temp) # 将取样的矩阵根据其灰度值进行处理
ret,img=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# img = cv2.resize(img,(128,64))
cv2.imwrite("output.jpg",img)
cv2.imshow("title",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图:
处理后的图像:
这里只定义的2x2的矩阵,因为我想在 128x64的屏幕上进行显示,实际上是我想多了,我的屏幕分辨率太小了,即使牺牲的分辨率很小了还是没什么效果
作者:Hello_wshuo