打印机模拟(灰度篇)

零.前言

中山大学 软件工程 课程多媒体技术作业——图像抖动。包含技术简介和python代码实现。写于2017年9月23日。

一.背景

打印图片时,普通的黑白针式打印机是不能打出我们常用的256级灰度的点来的,因为针打是靠针击打色带从而在纸上形成黑点的,这样的设备只能选择打印一个点或者不打印一个点,因此不会打出灰点来。但如果我们需要的正是一个灰度图像,难道只能非黑即白了吗?技术上我们亟需解决这样的问题,而由此诞生图像抖动技术能让我们通过黑白两色,看到一张正常的灰色图像。

二.方法

图像抖动只要利用的是人眼的特性。在一个密集的二值点阵中,0代表的黑色点越密集,图像在这个位置附近显得颜色越深,即深灰色乃至黑色。反之,1代表的白色的点越密集,图像在这个位置附近显得颜色越浅,即浅灰色乃至白色。这实际是种误差扩散的方法。

在打印一张灰度级数为256的图片时时,每个像素用一个矩阵来表示它的灰度,如果要无差异的表示一个像素的颜色的话,我们需要用一个16*16的矩阵。因为这样一个矩阵可以出现0到256个1或0,即能表示257个灰度值,甚至多于256。

当然也可以用小于这个大小的矩阵表示,但越小的矩阵失真的程度就越大。

还有一种算法是,缩减灰度级别后,将新得到的像素值和原像素值的差按比例(可以均分)分到该点的领域上,即周围的八个像素点。这样也能使图像变得较平滑。

三.重点介绍

我重点关注了前一种算法,即用空间换亮度的算法。我尝试用python实现了这个算法。用python是因为它对图像处理支持的API很多,写起来会比较轻松,如果是C的话就麻烦多了。但之前我并没有正式接触过python,因此我花了一个下午从语法开始,到能运用一些API解决问题。因为很多还是没了解,例如python的二维数组和矩阵类型之间的异同,以及API的参数和返回值的含义,所以实现起来可能会比较笨拙。

主要方法是用2*2或3*3或4*4的矩阵来表示每个像素点,并且矩阵内存有一个唯一的整数(0到n^2-1,n为矩阵的边长)。在处理每个像素点时,将该像素值映射到0到n^2-1之间的一个整数上去。然后将对应的矩阵上所存整数值小于该值的点设为1,其余为0。这样就能处理一个像素点了,其它类推。

四.实验关键代码

主要难点还是API不熟悉吧。也就实现了将一张灰度图分别用2*2和3*3和4*4的矩阵来表示每个像素,模拟了打印机的打印过程。
代码如下:

from PIL import Image
from numpy import *
from pylab import *
import numpy as np
import matplotlib.pyplot as pltfilename = 'test.png';
im = Image.open(filename).convert("L");
width, height = im.size;data = array(im);
data.reshape(height, width);dim = 4;#2, 3 or 4
if dim == 2:paint = [[0, 2], [3, 1]];
elif dim == 3:paint = [[0, 7, 2], [8, 4, 5], [3, 6, 1]];
elif dim == 4:paint = [[0, 8, 2, 10], [12,4,14,6], [3,11,1,9],[15,7,13,5]];n = dim * height;
m = dim * width;
top_color = 255;
arr = [None] * n;
for i in range(len(arr)):  arr[i] = [0] * m;div = top_color / dim / dim;
for i in range(0, height):for j in range(0, width):tmp = int(data[i][j] / div);for ii in range(0, dim):for jj in range(0, dim):if paint[ii][jj] < tmp:arr[dim * i + ii][dim * j + jj] = top_color;else :arr[dim * i + ii][dim * j + jj] = 0;new_matrix = mat(arr);
new_im = Image.fromarray(new_matrix.astype(np.ubyte));
new_im.show();

五.实验结果

实验结果截图如下,从左到右分别是2*2、3*3和4*4的矩阵表示的抖动后的图像。可以看到尽管都有明显的瑕疵,但是随着矩阵增大,图片清晰度还是明显上去了。

再配上一张和原图的对比,差距还是很明显的。

打印机模拟(灰度篇)相关推荐

  1. Voron2.2 3D打印机制作-软件篇(1)

    Voron2.2 3D打印机制作-软件篇(1) 作者:Fortunate 日期:2020/4/15 Tip:教程都是参考官方原版说明,文档全程手码,自己并非专业,文中有误希望大佬及时提点! 前期准备 ...

  2. 湖南工业大学教务系统爬虫(模拟登陆篇)

    湖南工业大学教务系统爬虫(模拟登陆篇) 之前写了一个教务系统的爬虫程序,可以根据用户要求爬取任何一部分的数据,也可以模拟提交数据,可能这也是部分工大计算机学生比较感兴趣的,所以今天就在这分享一下整个的 ...

  3. 【雕爷学编程】Arduino动手做(77)---模拟灰度传感器

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  4. 自主移动机器人导论-模拟灰度传感器

    [[image:sensors for arduino6.png|thumb|400px|right|DFRobot模拟灰度传感器]] ==概述== 灰度传感器是模拟传感器,与Arduino专用传感器 ...

  5. 模拟灰度传感器循迹的程序_灰度传感器的工作原理

    灰度传感器是模拟传感器,有一只发光二极管和一只光敏电阻,安装在同一面上.灰度传感器利用不同颜色的检测面对光的反射程度不同,光敏电阻对不同检测面返回的光其阻值也不同的原理进行颜色深浅检测.在有效的检测距 ...

  6. Android基于Socket无线遥控 - 模拟触摸按键篇framework jar

    Android基于Socket无线遥控(一)-Socket基本模型搭建 http://233.io/article/1017992.html 本篇主要内容涉及模拟系统按键消息,单击事件,触屏事件等,模 ...

  7. 模拟灰度传感器循迹的程序_PLC编程,实例讲解西门子PLC模拟量编程

    给大伙分享的是关于西门子S7-300PLC模拟量方面的实例,包含了以下几个方面的要点: 1.对变送器进行取值,并进行控制 2.对模数功能块 FC105 进行调用 3.对 AI 模块进行设置 4.对 A ...

  8. 抖动法(Dithering)通过黑白二值像素,模拟灰度图

    https://blog.csdn.net/liyuanbhu/article/details/47445713

  9. 灰度传感器(模拟和智能)两种

    索引 1. 模拟灰度传感器 概述 技术规格 引脚定义 模拟灰度传感器引脚定义 连接示意图 示例代码 2. Smart Grayscale Sensor 智能灰度传感器 概述 技术指标 智能灰度传感器测 ...

  10. 从头学习爬虫(四十)高阶篇----模拟js生成Cookie中__jsl_clearance来破解加速乐的反爬虫机制

    本文主要提供中间模拟生成Cookie中__jsl_clearance字段来破解加速乐的反爬虫机制 前后通过postman模拟代替代码实现 一 需求 http://www.cyicai.com/info ...

最新文章

  1. 企业微信发送企业红包java_发放企业红包
  2. HDU1285拓扑排序模版题
  3. Hyperledger Fabric 1.4 搭建区块链浏览器
  4. java解析xml文件四种方式介绍、性能比较和基本使用方法
  5. gulp与webpack的区别
  6. JavaScript重载解读
  7. Pixysoft.Framework.Noebe.Comets开发实录
  8. C#调用自定义表类型参数
  9. UVA1368 UVALive3602 ZOJ3132 DNA Consensus String【贪心】
  10. mysql常量求和_Mysql之:count(*)、count(常量)、count(字段)的区别
  11. Hibernate配置文件与关联映射介绍
  12. 我购买了一台acer笔记本
  13. keil中函数变量定位方法
  14. python 网盘多帐号_教你怎么拥有(很多)百度网盘2T账号
  15. 获取QQ音乐排行榜数据
  16. 2023年天津仁爱学院专升本考试考务费网上缴费的通知
  17. 3 Linux虚拟机创建修改删除文件和文件夹
  18. 设备管理 android问号,设备管理器里有问号怎么办
  19. 美柚:女性移动APP安全攻防战
  20. SpringBoot关于文件上传配置的几种方式

热门文章

  1. 如何调整网站竞价关键词
  2. [ECharts] DEPRECATED: ‘normal‘ hierarchy in itemStyle has been removed since 4.0. All style properti
  3. oracle函数整理---first_value函数
  4. html在页面显示一个正方形,CSS实现一个自适应的正方形的方法示例
  5. 10亿数据导入oracle方案
  6. 中兴校招c语言在线笔试题,中兴2021校招软件在线笔试题
  7. C++编程-买卖股票的最佳时机
  8. 免费中通快递对接快递鸟单号查询接口对接方法
  9. 电影《阿凡达》观后感
  10. 2020-08-18 前端html与css学习笔记总结篇(超详细)