找了好久Atkinson的Java实现,始终没找到现成的,只有一个pde的参考:

https://github.com/danielepiccone/dithering_algorithms/blob/master/atkinson_color/atkinson_color.pde

用Java重新写了一下,核心代码如:

public class BMPConverter {public static byte[][] atkinsonDither(RGBTriple[][] image, RGBTriple[] palette) {int s = 1;byte[][] result = new byte[image.length][image[0].length];// Scan imagefor (int x = s; x < image.length-2*s; x+=s) {for (int y = 0; y < image[x].length-2*s; y+=s) {// Calculate pixelRGBTriple oldpixel = image[x][y];byte index = findNearestColor(oldpixel, palette);RGBTriple newpixel = palette[index];RGBTriple quant_error = new RGBTriple(oldpixel.getRed() - newpixel.getRed(), oldpixel.getGreen() - newpixel.getGreen(), oldpixel.getBlue() - newpixel.getBlue());result[x][y] = index;// Atkinson algorithm http://verlagmartinkoch.at/software/dither/index.htmlRGBTriple s1 = image[x+s][y];image[x+s][y] = adjustRGB(s1, quant_error);RGBTriple s2 = image[x-s][y+s];image[x-s][y+s] = adjustRGB(s2, quant_error);RGBTriple s3 = image[x][y+s];image[x][y+s] = adjustRGB(s3, quant_error);RGBTriple s4 = image[x+s][y+s];image[x+s][y+s] = adjustRGB(s4, quant_error);RGBTriple s5 = image[x+2*s][y];image[x+2*s][y] = adjustRGB(s5, quant_error);RGBTriple s6 = image[x][y+2*s];image[x][y+2*s] = adjustRGB(s6, quant_error);}}return result;}private static RGBTriple adjustRGB(RGBTriple originalRGB, RGBTriple error) {return new RGBTriple((new Double(originalRGB.getRed() +  1.0/8 * error.getRed())).intValue(),(new Double(originalRGB.getGreen() + 1.0/8 * error.getGreen())).intValue(),(new Double(originalRGB.getBlue() + 1.0/8 * error.getBlue()).intValue()));}private static byte findNearestColor(RGBTriple color, RGBTriple[] palette) {int minDistanceSquared = 255 * 255 + 255 * 255 + 255 * 255 + 1;byte bestIndex = 0;for (byte i = 0; i < palette.length; i++) {int Rdiff = (color.channels[0] & 0xff) - (palette[i].channels[0] & 0xff);int Gdiff = (color.channels[1] & 0xff) - (palette[i].channels[1] & 0xff);int Bdiff = (color.channels[2] & 0xff) - (palette[i].channels[2] & 0xff);int distanceSquared = Rdiff * Rdiff + Gdiff * Gdiff + Bdiff * Bdiff;if (distanceSquared < minDistanceSquared) {minDistanceSquared = distanceSquared;bestIndex = i;}}return bestIndex;}}public class RGBTriple {public final byte[] channels;public RGBTriple() {channels = new byte[3];}public RGBTriple(int R, int G, int B) {channels = new byte[]{(byte) R, (byte) G, (byte) B};}public byte getRed() {return channels[0];}public byte getGreen() {return channels[1];}public byte getBlue() {return channels[2];}
}

显示的效果如:

转载于:https://my.oschina.net/u/4042451/blog/3060817

使用Atkinson抖动算法处理价签图片相关推荐

  1. 使用Floyd-Steinberg抖动算法处理价签图片

    2019独角兽企业重金招聘Python工程师标准>>> Floyd-Steinberg抖动算法简直量身为价签这种低颜色呈现设备准备的.由于价签的墨水屏能够呈现的色彩非常有限,根据型号 ...

  2. Android 各种图片转黑白图和抖动算法的黑白图

    最近做的关于打印机打印图片的项目,需要将图片转为打印机能打的点阵位图.我参考了很多文章,但是也没有说的很详细的,其中流浪的鱼的csdn博客写的比较详细,但是,半路出家的Android菜鸟,表示没看太懂 ...

  3. Android 墨水屏黑白红色阶算法和抖动算法,拿过去直接用

    Android 墨水屏黑白红色阶算法和抖动算法, 拿过去直接用, 有问题直接下面问 色阶法 一张图像,我们可以把它划分为几个大的颜色域,图像上的每个像素点根据颜色跟这几个色域的趋近程度,被划分到这些颜 ...

  4. 用 Python 实现哈希算法检测重复图片

    用 Python 实现哈希算法检测重复图片 - 简书 Python实现哈希算法,并检测图片重复的教程_Steven_ycs的博客-CSDN博客_python实现哈希

  5. 灰度变换及dithering抖动算法

    1.灰度变化: 色深是一个可以显示灰阶个数的参数.对于8bit的显示器来说,灰阶数就是256个:对于10bit的显示器来说,灰阶数就是1024个,所以位数越高的显示器,灰阶范围也就越大,图像的明暗变化 ...

  6. 弗洛伊德-斯坦伯格抖动算法

    弗洛伊德-斯坦伯格抖动算法 这是一个真实的魔法技术.它愚弄了你的眼睛和大脑,让你以为自己看到的颜色要比实际的多. 一般来说,抖动是通过增加人工噪声去减少一个图像的颜色空间,主旨在于,一个区域的光量应该 ...

  7. 串口接收 DMA FIFO 双缓冲区配置 + 单色OLED屏幕灰度图像显示的抖动算法

    适用于单色OLED屏幕图像显示的抖动算法 Visual studio c++ STM32F407 0.96寸单色IIC通信OLED 5级灰度 串口DMA.双缓冲 github 抖动算法原理 DITHE ...

  8. python检测图片相同部分_用 Python 实现哈希算法检测重复图片

    在 Python 中导入 hashlib 模块,调用函数就可以生成某一个字符串或者文件的哈希值.这个算法对于未被篡改的上传文件非常有效,如果输入数据有细微变化,加密哈希算法都会导致雪崩效应,从而造成新 ...

  9. matlab decomposition filters,MATLAB小波去噪求助(附算法和显示图片)!不知自己哪个地方出了问题,求指点! - 信息科学 - 小木虫 - 学术 科研 互动社区...

    star2883 不是非常明白楼主的意思.我的理解是: 问题1:为什么中间两幅图,显示的都是空白? 答:你是指Figure2和Figure3的显示中,全是白色吗?这个是因为你用了colormap(ma ...

最新文章

  1. ubuntu 16.04 安装Caffe GPU版本
  2. matlab GUI——按下按钮在指定的坐标下绘制函数图像
  3. 周五跟大佬喝酒,顺便打了个球
  4. foxmail邮件加载失败重试_TP5实现邮件发送(PHP 利用QQ邮箱发送邮件「PHPMailer」)...
  5. Java中抽象类和接口的区别(来源一)
  6. JSP 页面 嵌入 google API 地图
  7. 《流畅的Python第二版》读书笔记——Python数据模型
  8. 威金蠕虫病毒症状和清除解决方法
  9. 卸载IE9重装IE9无法安装的原因及解决方法
  10. 前端——列表、表格、表单
  11. 《区块链基础知识25讲》-第七讲-双花问题
  12. Unity 3D模型展示框架篇之项目整理
  13. 刘强东都想明白了,你们却还在讨论流量焦虑
  14. 前端web:响应式Web开发优缺点总结
  15. 使用代理服务器之后浏览器无法联网的解决办法
  16. exercise code 8
  17. 手游爆发“平台战”启幕
  18. Pythonnet简介
  19. 0037-java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind
  20. 使用cheerio拿一些数据

热门文章

  1. Vue2 脚手架下载及配置淘宝镜像--和ieda的配置和打开
  2. form表单注意点合集(文本域、单选框、复选框、下拉框等)
  3. 国风频频出圈!品牌如何借势发力?小红书数据查询3招玩转国风
  4. 初级、中级和高级开发人员的差距在哪里?
  5. C++编程--原子变量
  6. 飞机仓位区分代表的含义
  7. 为什么商务人都申请163邮箱,163邮箱怎么注册登陆呢?
  8. 基于Javaweb的小项目(类似于qqzone) 8 —— 回复相关操作
  9. 思科、华为、H3C常用命令对比大全
  10. signature=238bc634dea41b329480120e2b242d0b,dea-8k_20191106.htm