python-opencv实现抖动算法

抖动算法简单介绍

简单说就是牺牲分辨率来提高颜色数量。
通过黑点的疏密程度来进行灰度的显示。
例如墨水屏幕只能显示黑白,那么我们可以取样一部分区域矩,例如2x2的一个矩阵,来显示5个级别的灰度,用4个像素当成一个像素来看,就会有5个级别的灰度。
在这里插入图片描述
通过这种方法就可以牺牲掉一半的分辨率(其实是1/4),来显示出5个级别的灰度,当然如果扩大取样矩阵可以获得更多级别的灰度,同时也有牺牲很大的分辨率。
取样的矩阵为nxn,显示颜色灰度的级别一共有 (nxn+1),那么正常的灰度级别为256级,也就是最大取样16x16的矩阵就够用了。

代码实现

import cv2
import 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的屏幕上进行显示,实际上是我想多了,我的屏幕分辨率太小了,即使牺牲的分辨率很小了还是没什么效果

posted @ 2021-03-15 21:59  Hello_wshuo  阅读(547)  评论(0编辑  收藏  举报