1.实例演示图片转素描效果

首先我们来看一下具体的效果,在项目中添加依赖

<repositories><repository><id>jitpack.io</id><url>https://jitpack.io</url></repository>
</repositories><dependency><groupId>com.github.liuyueyi</groupId><artifactId>java-jhlabs</artifactId><!-- replace by newest version  --><version>1.0</version>
</dependency>
复制代码

实用姿势

private static void toSketch(String imgPath, String output) throws IOException {BufferedImage src = ImageIO.read(Objects.requireNonNull(Img2SketchTest.class.getClassLoader().getResourceAsStream(imgPath)));src = ImageUtils.convertImageToARGB(src);//图像灰度化PointFilter grayScaleFilter = new GrayscaleFilter();BufferedImage grayScale = new BufferedImage(src.getWidth(), src.getHeight(), src.getType());grayScaleFilter.filter(src, grayScale);//灰度图像反色BufferedImage inverted = new BufferedImage(src.getWidth(), src.getHeight(), src.getType());PointFilter invertFilter = new InvertFilter();invertFilter.filter(grayScale, inverted);//高斯模糊处理GaussianFilter gaussianFilter = new GaussianFilter(20);BufferedImage gaussianFiltered = new BufferedImage(src.getWidth(), src.getHeight(), src.getType());gaussianFilter.filter(inverted, gaussianFiltered);// 灰度图像和高斯模糊反向图混合ColorDodgeComposite cdc = new ColorDodgeComposite(1.0f);CompositeContext cc = cdc.createContext(inverted.getColorModel(), grayScale.getColorModel(), null);WritableRaster invertedR = gaussianFiltered.getRaster();WritableRaster grayScaleR = grayScale.getRaster();// 混合之后的就是我们希望的结果BufferedImage composite = new BufferedImage(src.getWidth(), src.getHeight(), src.getType());WritableRaster colorDodgedR = composite.getRaster();cc.compose(invertedR, grayScaleR, colorDodgedR);//输出做好的素描File outputfile = new File(output);ImageIO.write(composite, "png", outputfile);
}
复制代码

表现结果如下

2. 算法原理

作为一个图像处理小白,网上搜索了一下,素描算法比较多,通过多番比较,感觉整体思想相差不大,大致是以下几个步骤

  1. 原图灰度化
  2. 临界值处理(小于某个临界值的像素值设置为0)
  3. 第二步的图像反色处理
  4. 第二步与第三步的图片混合处理

接下来将以我自己的粗浅理解出发,尝试做一下算法的解析

2.1 灰度处理

图像灰度处理,主要是为了将最终图片的色彩控制在五彩斑斓的灰白中,保持和我们常见的素描风格保持一致

具体的像素灰度处理,有一个广为流传的公式 (我也没找到原始出处,不知道是哪位大神给出的)

avgColor = red * 0.299f + green * 0.587f + blue * 0.114f
复制代码

2.2 边界凸显

素描效果的一个核心要点在于对于物体的边缘轮廓进行定位,清洗的显示轮廓信息,对于之外的信息进行抽象模糊处理;简单来讲就是改凸显的地方凸显出来,不重要的地方模糊些处理

那么问题就是如何定位轮廓,如何模糊处理?

上面步骤中的第二、第三两步主要就是来干这个事情的;临界值 + 反向,主要就是为了定位边界轮廓(盲猜一波:轮廓边缘的像素差异较大,两次处理叠加之后,轮廓处像素信息受影响较小,和之前的值差别不大,有相关背景知识的大佬可以指点一下)

具体实现的方式呢,最容易想到的一点是

  • 设置一个阈值,小于这个阈值的像素设置为0;然后反向,两个图像进行混合处理,从而凸显轮廓

更先进一点的做法:

  • 傅里叶变换、高斯模糊、梯度算法等出现在各相关论文中的算法(至于为什么有效,我也不知道了...)

​​​​​​​

3. 快速使用

文章的最开始就给出了一个素描处理的demo,输出效果基本ok,但是使用姿势有点麻烦;其实现就是借助jh-labs的滤镜来实现各种操作,对于应用者而言(比如我),可能并不关心具体细节,只要结果,有更简单的使用姿势么?

当然也是有的,下面这个开源项目已经做好了封装

最新版本为3.0,可以到中央仓库直接获取(如果还没有找到,不要慌,我还没有提交,因为3.0还在内测中)

引入依赖

<!-- https://mvnrepository.com/artifact/com.github.liuyueyi.media/photo-plugin -->
<dependency><groupId>com.github.liuyueyi.media</groupId><artifactId>photo-plugin</artifactId>
</dependency>
复制代码

使用姿势

@Test
public void testSketch() {BufferedImage out = PhotoOperateWrapper.of(OperatorEnum.SKETCH).setImg("https://t7.baidu.com/it/u=4162611394,4275913936&fm=193&f=GIF").build().asImg();System.out.println("----");
}

纯java实现相片转素描相关推荐

  1. 干掉前端!3分钟纯 Java 注解搭个管理系统,我直接好家伙

    最近接触到个新项目,发现它用了一个比较有意思的框架,可以说实现了我刚入行时候的梦想,所以这里马不停蹄的和大家分享下. 我刚开始工作接触的项目都还没做前后端分离,经常需要后端来维护页面,有时候觉得自己好 ...

  2. 邮件发送 --- 纯Java、JavaWeb、Spring三种实现方式

    邮件发送学习笔记~ 一.邮件发送介绍 要在网络上实现邮件功能,必须要有专门的邮件服务器! 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中! ...

  3. 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

    经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...

  4. Android --- 使用纯java代码实现相对布局(通俗易懂)

    java布局 java代码布局和xml布局的区别 1.Java纯布局更加的灵活,比如自定义控件或一些特殊要求时,使用java代码布局 2.常用的xml布局是所见即所得的编写方式,以及xml本身拥有一些 ...

  5. springMVC纯java代码配置(一)- 数据源与事务管理(转载的哦)

    原文地址:http://my.oschina.net/devleon/blog/530803?fromerr=9Z8ZFdbf 摘要 自Spring3.0开 始,Spring正式将JavaConfig ...

  6. Hypersonic SQL开源数据库方向比较流行的纯Java开发的关系型数据库

    Hypersonic SQL Hypersonic SQL开源数据库方向比较流行的纯Java开发的关系型数据库.好像不是JDBC兼容的,JDBC的很多高级的特性都没有支持,不过幸好支持ANSI- 92 ...

  7. sqlcipher java_纯java环境下sqlsqlcipher解密sqlite数据库文件

    由于工作需要,最近一周以来研究sqlite数据库文件的解密方法.最终采用sqlcipher工具进行解密.由于sqlcipher的实现大多是支持android的,修改为纯java平台下的代码有难度,因此 ...

  8. java 存储数据到文件中_本机速度文件支持的“纯” Java大数据存储

    java 存储数据到文件中 动机 所有这一切始于意识到我买不起足够大的计算机. 音频处理需要大量的内存. Audacity是一款出色的免费音频处理器,它使用文件支持的存储系统对其进行管理. 这是解决此 ...

  9. 本机速度文件支持的“纯” Java大数据存储

    动机 所有这一切始于意识到我买不起足够大的计算机. 音频处理需要大量的内存. Audacity是一款出色的免费音频处理器,它使用文件支持的存储系统对其进行管理. 这是解决此类问题的常用方法,在这些问题 ...

最新文章

  1. 【c语言】C语言配置文件解析库——iniparser
  2. 网络工程师课程---4、网络层(网关是什么)
  3. IOS自定义表格UITableViewCell
  4. 15 Small-Space Tricks We're Stealing from Real Tiny Apartments
  5. 使用Docker中国官方镜像的加速地址
  6. python心得体会-终于懂得python基础学习心得
  7. 【错误记录】OD 调试器附加进程时找不到进程 ( CE 工具可以附加进程 )
  8. linux oracle 创建表空间2016,Linux下Oracle表空间及用户创建
  9. javascript中对变量类型的推断
  10. 使用SQLite数据库存储数据(2)-向表中插入记录
  11. python github库_让pip使用git和github存储库
  12. 计算机学硕比专硕累吗,2019计算机考研常识:学硕与专硕对比
  13. EASE:一种融合实体信息的句子嵌入对比学习方法
  14. EMLOG模板 自适应Fontopen3 可做企业站
  15. 现代软件工程 教课心得
  16. 渗透笔记之web漏洞概述
  17. DeviceIoControl 错误码:error code 87 问题解决
  18. Java中string字符串和char字符之间的千丝万缕
  19. 关于城市旅游的HTML网页设计 HTML+CSS上海博物馆网站 dreamweaver作业静态HTML网页设计 html网页制作期末大作业
  20. Excel如何快速将多列数据复制到一列中

热门文章

  1. VScode中npm install报错
  2. Cis-Glyoxal-Cyclam ,CAS: 74199-16-9,CIS-十氢-1H,6H-3A,5A,8A,10A-四氮杂芘
  3. RNA 12. SCI 文章中肿瘤免疫浸润计算方法之 CIBERSORT
  4. 2022下半年教资已经开始注册,1分钟看懂证件照审核要求
  5. PDF无法打印 提示输入文件名
  6. Linux基金会:开源就业的最新趋势和最需要的技能
  7. 多米诺骨牌——变形版0,1背包问题
  8. 最懂选择的人用这4种策略避免纠结
  9. 数电实验(一)利用与非门设计四舍五入判别电路
  10. 连接oracle的scott数据库,Oracle scott用户连接数据库出错的解决方法