硬件设备
- ESP8266
- Epaper_2.13 b/w(汉朔电子价签)
- SPI驱动板
图片显示
这里墨水屏的驱动程序采用微雪的示例程序进行驱动
微雪资料:
ePaper-2.13
.
这里说明一下在进行图片显示过程中遇到的问题,微雪资料中给除了图片的取模软件:
Image2Lcd图片取模软件
开始使用取模软件时感觉还不错,但是在逐渐使用画面比较复杂的图片进行展示时,就发现使用取模软件进行取模时,软件的默认算法采用图像的二值化处理,虽然软件提供了不同阈值下的二值化调整,但是在使用比较复杂的图片进行取模时,得到的图像信息就非常不可观了:
图像背景单一,轮廓明显
图像背景相对复杂,轮廓信息模糊
由此可见,在图像内容相对复杂之后,二值化的结果往往就不尽人意,在这种情况下,图像抖动就可以发挥相当的作用。
抖动的理解
所谓抖动,在看过相关实现代码后,我的看法就是将原本确定的那个二值化阈值任意化,将原本的阈值用一个不确定的随机数进行代替,在同样输出0与255像素的图片上增加一定的任意性,由此实现在图像灰度图中,值越接近255的像素有更大可能二值化为255,而那些相对接近0的像素值也有更大可能二值化为0。
由此可见,原本二值化为0的像素点,也有小概率出现值为255的像素,同理在原本二值化为255的点也出现了为0的像素,由此达到一定的模拟灰度的效果。
简单的抖动处理有一下的代码展示:
# 图像抖动
def RandomDithering(img,dither):
x,y = img.shape
ret = img.copy()
for i in range (x):
for j in range(y):
ran = random.randint(0,255)%(2*dither)-dither
if ran+ret[i][j]>=128:
ret[i][j] = 255
else:
ret[i][j] = 0
return ret
通过调整这里的dither,可以实现对抖动的噪点进行控制,详细内容参考:
抖动法显示灰度图像(Qt 实现)
墨水屏图片抖动取模
至此,我们已经明确了在实验中遇到的问题以及解决方法,于是我写了一个python实现的图片取模程序。
抖动效果展示
取模函数
# 写入文件
def Write_C(data):
filename = imgname.split('.')[0]+".c"
with open(filename,'w') as obj:
obj.write("const unsigned char "+ imgname.split('.')[0] +"[] {\n"+ data +"};")
# 进制转换
def sethex(summ):
summ = int(summ)
hexstr = hex(summ)
if len(hexstr) == 3:
restr = "0x0"+hexstr[2]
else:
restr = hexstr
return restr+","
# 写出c文件
def OutPut_C(img):
x,y = img.shape
data = ''
dith = img[::-1,:]
dith[dith>128] = 1
time=8
summ = 0
for i in range(y):
for j in range(x):
summ += dith[j][i]*(2**(time-1))
time -=1
if time == 0:
data += sethex(summ)
time = 8
summ = 0
data += sethex(summ)
time = 7
summ = 0
data += '\n'
Write_C(data)
写出的程序格式仿照取模软件的结果
取模生成.c文件
由于我接触图像处理时日不多,实在时实力有限,目前仅实现了对250*122像素下的图片取模操作,代码写在jupyter中也没来得及整理,我将源代码上传到了git中,欢迎借鉴、优化与指正!
最后放上写入ESP8266的效果展示
git地址:https://github.com/LNfromNorth/ESP8266_Epaper2_13