1 图片消除锯齿

图片在缩小过程中已办都会产生一定的锯齿感,最好在缩放的过程中设置一定的消除锯齿效果

// 消除锯齿
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);或image = image.getScaledInstance(width,height,BufferedImage.SCALE_SMOOTH)
g.drawImage(image,x,y,observer);

在压缩过程中一般会有一些失真,需要的话可以加一点锐化,但是锐化算法运行的比较慢,相对于图片缩放的时间,所以看选择使用,如果对时间处理要求高,可以不加

2 图片锐化

锐化使用一阶微分梯度锐化或者拉普拉斯锐化都可以,具体代码看
java图像处理之拉普拉斯锐化和一阶微分梯度锐化

在调用锐化方法获取算好的锐化图像后,叠加到图片上最好使用0.2f的透明度覆盖,否则锐化程度很严重,看起来更加失真

    BufferedImage imageSharpen = ImageSharpen.lapLaceSharpDeal(destImage);//设置为透明覆盖g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.2f));//在背景图片上添加锐化的边缘g.drawImage(imageSharpen, 0, 0, imageSharpen.getWidth(), imageSharpen.getHeight(), null);// 释放对象 透明度设置结束g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

3 锐化工具类

public class ImageSharpen {/*** 图像锐化 二阶微分锐化,拉普拉斯算子 定义一个3*3滤波器,计算中心像素与上下左右四个像素差值** @param image*/public static BufferedImage lapLaceSharpDeal(BufferedImage image) {BufferedImage tempImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
//            Stream.iterate(1, item -> item+1).limit(image.getWidth()-2)
//                    .parallel().forEach( i -> {for (int i = 1; i < image.getWidth() - 1; i++) {for (int j = 1; j < image.getHeight() - 1; j++) {int rgb = image.getRGB(i, j);int rgb1 = image.getRGB(i - 1, j);int rgb2 = image.getRGB(i + 1, j);int rgb3 = image.getRGB(i, j - 1);int rgb4 = image.getRGB(i, j + 1);int[] R = new int[]{(rgb1 >> 16) & 0xff, (rgb2 >> 16) & 0xff, (rgb3 >> 16) & 0xff,(rgb4 >> 16) & 0xff, (rgb >> 16) & 0xff};int[] G = new int[]{(rgb1 >> 8) & 0xff, (rgb2 >> 8) & 0xff, (rgb3 >> 8) & 0xff, (rgb4 >> 8) & 0xff,(rgb >> 8) & 0xff};int[] B = new int[]{rgb1 & 0xff, rgb2 & 0xff, rgb3 & 0xff, rgb4 & 0xff, rgb & 0xff};double dR = R[0] + R[1] + R[2] + R[3] - 4 * R[4];double dG = G[0] + G[1] + G[2] + G[3] - 4 * G[4];double dB = B[0] + B[1] + B[2] + B[3] - 4 * B[4];double r = R[4] - dR;double g = G[4] - dG;double b = B[4] - dB;rgb = (255 & 0xff) << 24 | (clamp((int) r) & 0xff) << 16 | (clamp((int) g) & 0xff) << 8| (clamp((int) b) & 0xff);tempImage.setRGB(i, j, rgb);}}return tempImage;}/*** 一阶微分梯度锐化*/public static BufferedImage degreeSharpDeal(BufferedImage image) {BufferedImage tempImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());for (int i = 1; i < image.getWidth() - 1; i++) {for (int j = 1; j < image.getHeight() - 1; j++) {List<Integer> rList = new ArrayList<>();List<Integer> gList = new ArrayList<>();List<Integer> bList = new ArrayList<>();for (int x = -1; x < 2; x++) {for (int y = -1; y < 2; y++) {int rgb = image.getRGB(i + x, j + y);int R = (rgb >> 16) & 0xff;int G = (rgb >> 8) & 0xff;int B = rgb & 0xff;rList.add(R);gList.add(G);bList.add(B);}}int r = getResult(rList);int g = getResult(gList);int b = getResult(bList);r = rList.get(4) + r / 4;g = gList.get(4) + g / 4;b = bList.get(4) + b / 4;int rgb = (255 & 0xff) << 24 | (clamp(r) & 0xff) << 16 | (clamp(g) & 0xff) << 8 | (clamp(b) & 0xff);tempImage.setRGB(i, j, rgb);}}return tempImage;}// 执行一阶微分计算private static int getResult(List<Integer> list) {int result = Math.abs(list.get(0) + list.get(3) + list.get(6) - list.get(2) - list.get(5) - list.get(8))+ Math.abs(list.get(0) + list.get(1) + list.get(2) - list.get(6) - list.get(7) - list.get(8));return result;}// 判断a,r,g,b值,大于256返回256,小于0则返回0,0到256之间则直接返回原始值private static int clamp(int rgb) {if (rgb > 255)return 255;if (rgb < 0)return 0;return rgb;}}

4 遗留问题:

ImageSharpen.lapLaceSharpDeal循环一次,取三个点进行计算拉普拉斯微分算子计算灰度突变区域,然后在记录灰度突变区域,本质上等于PS中的高反差保留。因为这个动作比较耗时,想使用多线程来增加处理速度,但是遗憾的是tempImage.setRGB(i, j, rgb)使用的synchronized修饰,所以单独使用多线程是没有用的,后面想到重写BufferedImage的setRGB方法,按照像素点 i和j来作为ConcurrentHashMap的key值,这样可以只锁相同的key,但是后面调试比不重写前耗时更多。各位同学如果有更好的方法可以发出来一起交流。

BufferedImage的setRGB方法源码:public synchronized void setRGB(int x, int y, int rgb) {raster.setDataElements(x, y, colorModel.getDataElements(rgb, null));
}

参考:
基于Graphics2D drawImage图片失真的解决方案
MATLAB图像处理-图片的锐化增强(附代码)

图片消除锯齿和图片锐化相关推荐

  1. php 图片解析,PHPThumb图片处理实例解析

    下载地址(github.com/masterexploder/PHPThumb). 注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意. 处理图片的地方多不胜数, ...

  2. 图片转字符图片工具类

    ├── cn.xsshome.imagetool //包名├── convert │ └── ImageToChar //图片转字符图片.文本方法 ├── slideverifycode │ └── ...

  3. python字符照片_python图片转字符图片

    python图片转字符图片代码 话不多说,直接上代码. *************************** #-*- coding:utf-8 -*- from PIL import Image ...

  4. R语言ggplot2可视化在可视化的接种中插入图片、添加图片实战

    R语言ggplot2可视化在可视化的接种中插入图片.添加图片实战 目录 R语言ggplot2可视化在可视化的接种中插入图片.添加图片实战

  5. Flask显示图片并设置图片的缓存时间

    1.显示图片 想要Flask在网页中显示图片,需要使用template 模板,例如 index.py from flask import Flask, render_template, url_for ...

  6. PHP图片裁剪_图片缩放_PHP生成缩略图

    2019独角兽企业重金招聘Python工程师标准>>> 在制作网页过程中,为了排版整齐美观,对网页中的图片处理成固定大小尺寸的图片,或是要截去图片边角中含有水印的图片,对于图片量多, ...

  7. mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换(上)

    看到标题估计有人懵了,不过对于用到的人可以说是眼前一亮啊.做了点这个小东西,断断续续的花了我好长时间.本来不想写,但是网上的资料都是坑爹呢. 中国的抄袭果然是根深蒂固啊.上到机构.砖家.公司,下到各种 ...

  8. java 图片处理 图片缩略图,java怎么生成图片缩略图,缩小图片,高清图片缩小

    java如何生成图片缩略图,缩小图片,高清图片缩小 可以把图片缩小到理想的倍数,也可以根据自己的需要来具体规定图片转化后的大小 对于类型为jpg的图片来说,只需要三个参数就能转化得到自己想要的图片 参 ...

  9. python爬取图片-Python爬取网页中的图片(搜狗图片)详解

    前言 最近几天,研究了一下一直很好奇的爬虫算法.这里写一下最近几天的点点心得.下面进入正文: 你可能需要的工作环境: Python 3.6官网下载 本地下载 我们这里以sogou作为爬取的对象. 首先 ...

最新文章

  1. (转)分布式文件存储FastDFS(五)FastDFS常用命令总结
  2. empty、isset和is_null的比较
  3. 文档标题:WinNTWin2K下实现进程的完全隐藏
  4. 数据库事务系列-事务模型基础
  5. c++ 计算正弦的近似值_数值计算笔记1·基本知识
  6. pythonfor循环100次_在for循环中只打印一次
  7. 等式约束和不等式约束下的KKT条件求法
  8. 生活随笔:大学需要确立自己的方向
  9. Android中1像素Activity进程保活
  10. 如何模块化设计B端系统?
  11. POJ2155 Matrix二维线段树经典题
  12. access中布局为阶梯怎么设计_access模拟题1 -
  13. 基于Ubuntu虚拟机的Linux驱动开发入门
  14. 抖音的服务器究竟有多大
  15. 【机器学习理论】换底公式--以e,2,10为底的对数关系转化
  16. WinCE系统USB功能定制
  17. python股票编程_Python爬虫回测股票的实例讲解
  18. 重装系统,超详细教程
  19. SAT数学解题方法介绍
  20. cheng@ARM结构与编程之day3-MOV LSL

热门文章

  1. 天语w806大黄蜂原生安卓官方测试版开放下载
  2. cmos门电路输入端悬空相当于_高阻态和三态门电路原理
  3. Java 初学万年日历
  4. html往WPS粘贴格式乱,WPS文档怎么清除格式解决复制粘贴格式错乱的问题
  5. 中国人为什么丧失了慢的能力?
  6. 隐藏iframe滚动条,并禁止滑动
  7. 想跳槽涨薪的必看!2021年百度Java面试真题,跳槽大厂必看!
  8. 云场景实践研究第7期:驴妈妈旅游网
  9. Excel函数应用实例:计算零存整取未来值(转)
  10. 蛮荒而漫长的手动计算时代