Java实现去除文档阴影的示例代码

目录
  • 一、前言
  • 二、实现原理
    • 1. 图像
    • 2. 灰度转换
    • 3.阈值处理
  • 三、代码实现
    • 1.读取图像
    • 2.阈值处理

一、前言

文稿扫描大家用的都比较频繁、想是各种证件、文件都可以通过扫描文稿功能保存到手机。相比直接拍照,在扫描文稿时,程序会对图像进行一些矫正。比如去除阴影、修正倾斜、旋转矫正等。进行这些处理后的图片要更加容易识别。今天就来讨论以下去除阴影的操作。

二、实现原理

1. 图像

在开始实现前,我们来了解一些图像相关的知识。这里讨论RGB图像,也就是我们俗称的彩色的图像。图像可以被看作是一个height×width的数组,每一个数表示一个像素。如果是彩色的图像,每个像素会包含RBG三个值,最低字节表示G、次低字节表示B、第三字节表示R。

比如像素值为:

0x00ff00

其RBG值分别为:

R: 0x00
G: 0xff
B: 0x00

如果想要从原像素中取RGB的值,可以使用按位与操作,示例如下:

// pixel是从图像中取出来的数
int[] rgb = new int[3];
rgb[0] = (pixel & 0xff0000) >> 16;
rgb[1] = (pixel & 0xff00) >> 8;
rgb[2] = (pixel & 0xff);

因为获取R和G的时候,保留的是高位,我们希望得到的是一个低位的数据,因此向右移一定位。

2. 灰度转换

有时候,为了方便处理会把图像转换成灰度图像。转换成灰度图像的方法有很多,一种非常简单的办法就是让rgb三个通道都为同样的值,这个值就是rgb三个值的均值。

3.阈值处理

阈值处理是今天关键部分,阈值处理的思想非常简单,就是当图像像素值大于阈值时将其处理为最大值,当像素小于等于阈值时将其处理为0。这样可以得到一张完全的黑白图像。

在文稿中,文字部分可以看作是黑色,背景部分可以看作是白色,而阴影则是介于黑白之间的值。如果想要去除阴影,则需要对图像进行阈值处理,把阈值设定为小于阴影的值。比如下图:

左图是原图,其中灰色部分为阴影,需要去除。这时我们对图像进行阈值处理,把阈值设定为50,那么阴影部分就会被设置成255,文字部分和背景部分变换都不大,这样就实现了文稿的阴影去除工作。

三、代码实现

1.读取图像

首先来看看如何读取图像以及如何访问图像的像素,这里使用ImageIO类。代码如下:

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class DocumentDealing {

    public static void main(String[] args) throws Exception {
        String imagePath = "D:/images/imgs/10000.jpeg";
        BufferedImage bi = ImageIO.read(new File(imagePath));
        //获取图片宽高
        int width = bi.getWidth();
        int height = bi.getHeight();
        System.out.println("width:" + width + ",height:" + height);
        //获取坐标为(0, 0)位置的像素
        int pixel = bi.getRGB(0, 0);
        System.out.println("pixel" + pixel);
        //获取rgb值
        int[] rgb = new int[3];
        rgb[0] = (pixel & 0xff0000) >> 16;
        rgb[1] = (pixel & 0xff00) >> 8;
        rgb[2] = pixel & 0xff;
        System.out.println(
                "r:" + rgb[0] +
                        "\tg:" + rgb[1] +
                        "\tb:" + rgb[2]
        );
    }

    public static int[] getRgb(BufferedImage bi, int x, int y) {
        int[] rgb = new int[3];
        int pixel = bi.getRGB(x, y);
        rgb[0] = (pixel & 0xff0000) >> 16;
        rgb[1] = (pixel & 0xff00) >> 8;
        rgb[2] = (pixel & 0xff);
        return rgb;
    }

}

我们可以通过下面代码读取图片,其中imagePath是图片路径:

BufferedImage bi = ImageIO.read(new File(imagePath));

BufferedImage可以获取图片的宽、高、某个点的像素等。为了方便,编写一个getRgb来把pixel转成一个rgb数组。代码输出结果如下:

width:400,height:400
pixel-2853206
r:212    g:118    b:170

2.阈值处理

知道了上面的基本操作后,就可以开始进行阈值处理了。阈值处理就是求rgb均值mean,如果mean大于阈值,则把像素设置为0xffffff,否则设置为0。具体代码如下:

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;

public class DocumentDealing {

    public static void main(String[] args) throws Exception {
        String imagePath = "C:/Users/Administrator/Desktop/document.jpg";
        threshold(imagePath, "result.jpg", 50);
    }

    public static void threshold(String imagePath, String savePath, int threshold) throws Exception{
      	//读取图片
        BufferedImage bi = ImageIO.read(new File(imagePath));
        //读取宽高
      	int width = bi.getWidth();
        int height = bi.getHeight();
      	//遍历图片像素
        for(int y = 0; y < height; y ++){
            for(int x = 0; x < width; x ++){
                int[] rgb = getRgb(bi, x, y);
              	//计算rgb均值
                int grayScale = (rgb[0] + rgb[1] + rgb[2]) / 3;
              	//如果均值大于阈值,则赋值将该像素设置为0xffffff(全白),否则赋值为0(全黑)
                if(grayScale > threshold){
                  	bi.setRgb(x, y, 0xffffff);
                }else{
                  	bi.setRgb(x, y, 0);
                }
            }
        }
      	//保存图片
        ImageIO.write(bi, "jpg", new File(savePath));
    }

    public static int[] getRgb(BufferedImage bi, int x, int y){
        int[] rgb = new int[3];
        int pixel = bi.getRGB(x, y);
        rgb[0] = (pixel & 0xff0000) >> 16;
        rgb[1] = (pixel & 0xff00) >> 8;
        rgb[2] = (pixel & 0xff);
        return rgb;
    }

}

下图是原图和处理后的结果:

左图中有两处阴影,右侧则去除了阴影。最终效果图与设定的阈值有关系,当阈值设置不恰当时,会导致结果图比原图更糟糕,或者导致最终文字目标也被去除了。这里可以用循环来解决,代码如下:

public static void main(String[] args) throws Exception {
    String imagePath = "C:/Users/Administrator/Desktop/document.jpg";
      for (int i = 50; i < 127; i++) {
        threshold(imagePath, "imgs/result" + i + ".jpg", i);
      }
}

大家可以自行测试。有时候之间阈值处理不能很好的去除阴影,这个时候会结合一些其它办法。包括滤波操作、形态学处理等。

到此这篇关于Java实现去除文档阴影的示例代码的文章就介绍到这了,更多相关Java去除文档阴影内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java如何为 PPT 中的图形添加阴影效果

    在PowerPoint文档中,给图片添加阴影效果能增强图片的逼真度,使其贴近现实效果,提升文档的美观度. 本文将展示如何使用Free Spire.Presentation for Java为PPT中的图形添加阴影效果.除了文中展示的预设阴影效果,还可以添加内部阴影(InnerShadowEffect).外部阴影(OuterShadowEffect).柔化边缘阴影(SoftEdgeEffect)等. JAR包导入 方法一:下载Free Spire.Presentation for Java包并解压

  • Java实现去除文档阴影的示例代码

    目录 一.前言 二.实现原理 1. 图像 2. 灰度转换 3.阈值处理 三.代码实现 1.读取图像 2.阈值处理 一.前言 文稿扫描大家用的都比较频繁.想是各种证件.文件都可以通过扫描文稿功能保存到手机.相比直接拍照,在扫描文稿时,程序会对图像进行一些矫正.比如去除阴影.修正倾斜.旋转矫正等.进行这些处理后的图片要更加容易识别.今天就来讨论以下去除阴影的操作. 二.实现原理 1. 图像 在开始实现前,我们来了解一些图像相关的知识.这里讨论RGB图像,也就是我们俗称的彩色的图像.图像可以被看作是一

  • Java 实现Excel文档添加超链接的代码

    超链接即内容链接,通过给特定对象设置超链接,可实现载体与特定网页.文件.邮件.网络等的链接,点击链接载体可打开链接目标,在文档处理中是一种比较常用的功能.本文将介绍通过Java程序给Excel文档添加超链接的方法,这里支持添加多种不同类型的链接,如URL网页链接.Workbook工作簿链接.File文档链接.Unc网络路径链接等. 使用工具:Free Spire.XLS for Java (免费版) 注:通过官网下载包,并解压将lib文件夹下的jar文件导入java程序.如下导入效果: Java

  • 如何通过Java打印Word文档

    这篇文章主要介绍了如何通过Java打印Word文档,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java 打印Word文档 本文介绍如何在Java程序中通过物理打印机和虚拟打印机来打印Word文档的方法.文中使用了类库Spire.Doc for Java,可通过 官网下载jar文件并导入程序或者直接通过maven仓库安装导入. [示例1]通过物理打印机打印 import com.spire.doc.Document; import com.s

  • java将XML文档转换成json格式数据的示例

    本文介绍了java将XML文档转换成json格式数据的示例,分享给大家,具体如下: 功能 将xml文档转换成json格式数据 说明 依赖包: 1. jdom-2.0.2.jar : xml解析工具包; 2. fastjson-1.1.36.jar : 阿里巴巴研发的高性能json工具包 程序源代码 package com.xxx.open.pay.util; import com.alibaba.fastjson.JSONObject; import org.jdom2.Element; imp

  • Java 在Word文档中添加艺术字的示例

    与普通文字相比,艺术字更加美观有趣也更具有辨识度,常见于一些设计精美的杂志或宣传海报中.我们在日常工作中编辑Word文档时,也可以通过添加艺术字体来凸显文章的重点,美化页面排版.这篇文章将介绍如何使用Free Spire.Doc for Java在word文档中添加艺术字并设置样式和效果. Jar包导入 方法一:下载Free Spire.Doc for Java包并解压缩,然后将lib文件夹下的Spire.Doc.jar包作为依赖项导入到Java应用程序中. 方法二:通过Maven仓库安装JAR

  • java EasyExcel面向Excel文档读写逻辑示例详解

    目录 正文 1 快速上手 1.1 引入依赖 1.2 导入与导出 2 实现原理 2.1 @RequestExcel 与 @ResponseExcel 解析器 2.2 RequestMappingHandlerAdapter 后置处理器 3 总结 正文 EasyExcel是一款由阿里开源的 Excel 处理工具.相较于原生的Apache POI,它可以更优雅.快速地完成 Excel 的读写功能,同时更加地节约内存. 即使 EasyExcel 已经很优雅了,但面向 Excel 文档的读写逻辑几乎千篇一

  • Java生成word文档的示例详解

    目录 目标 依赖 模版 实体 代码 目标 依赖 <!-- poi工具类--> <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.12.0</version> </dependency> 模版 实体 实体类需要和模版内的动态字段对应 代码 @GetMapping(value =

  • Java 替换word文档文字并指定位置插入图片

    先说下 需要的依赖包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-excelant</artifactId> <version>3.12</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <arti

  • 详解Java生成PDF文档方法

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持 iText,生成PDF文档,还支持将XML.Html文件转化为PDF文件: Apache PDFBox,生成.合并PDF文档: docx4j,生成docx.pptx.xlsx文档,支持转换为PDF格式. 比较: iText开源协议为AGPL,而其他两个框架协议均为Apache License v2.0. 使用PDFBox生成PDF就像画图

  • Java 在 Word 文档中使用新文本替换指定文本的方法

    创作一份文案,经常会高频率地使用某些词汇,如地名.人名.人物职位等,若表述有误,就需要整体撤换.文本将介绍如何使用Spire.Doc for Java,在Java程序中对Word文档中的指定文本进行替换. 工具/原料 Free Spire.Doc for Java(免费版) IntelliJ IDEA Jar文件获取及导入 方法1:先从官网下载jar包. 导入步骤: 下载后,解压文件,并将lib文件夹下的Spire.Doc.jar文件导入java程序.参考如下导入效果: 方法2:可通过maven

随机推荐