可编程诗歌使用 OCR
这篇白皮书介绍了如何使用 OCR Xpress for Java 对扫描的报纸进行 OCR,并对关键词进行编辑,最终实现我的目标。
您知道光学字符识别 (OCR) 可以激发您的艺术创造力吗?您是否见过 报纸涂黑诗歌?通过 OCR,我能够创建一个简单的程序,让我实现这一目标。这篇白皮书将介绍如何使用 OCR Xpress for Java 对扫描的报纸进行 OCR,并对关键词进行编辑,从而实现我的目标。编辑是一种非常流行的删除文档中敏感材料的方法。然而,它也可以很有趣。
引言
在我激发我的内在沃特·惠特曼之前,我需要几个功能。第一个是 OCR,第二个是单词/短语搜索,第三个是编辑,或者在我的情况下是反向编辑,最后一个是将其保存到文件。在本文中,我将简要介绍如何使用 OCR Xpress 创建一个小应用程序。
OCR 识别
让 OCR 正常运行是我成为现代诗人第一步。OCR 是将包含印刷/打印文本的图像(或图像)转换为电子输出的过程。OCR 在许多不同的公司中有许多用例,并且对盲人和视障人士也有实际需求。然而,我的意图更加异想天开。
//required accusoft dependencies package com.accusoft.ocrxpress.samples; import com.accusoft.ocrxpress.*; //java dependencies import java.awt.Color; import java.awt.image.*: import javax.imageio.*; import java.io.*; import java.util.*; //Display Image import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Flowlayout:
我使用了 OCR Xpress 随附的 Memory 示例,并添加了一个 NewspaperBlackout
类。上面是我类中需要的导入和包。
有几种不同的方法可以编写此应用程序,但我决定创建几个辅助函数。下面我使用了 InputString
、DisplayImage
、ConvertToBlack
和 ConvertRect
。
public class NewspaperBlackout { public static String InputString() { Scanner scanner = new scanner (System.in); System.out.prints "Type your poem. <Press Enter for default>"); return scanner.nextLine(); }
此辅助函数允许您按“Enter”键使用默认诗歌,或在控制台窗口中键入您自己的诗歌。
public static void DisplayImage(BufferedImage bi) { ImageIcon icon = new ImageIcon(bi); JFrame frame = new JFrame(); frame.setLayouts new FlowLayouts()); frame.setSize (bi.getWidth(), bi.getHeight()); JLabel lbl = new JLabel(); lbl.setIcon(icon); frame.add(lbl); frame.setWisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_0N_close); }
该辅助函数在 JFrame 中显示最终输出。
public static void convertToBlack(BufferedImage bi) { Color c = new Color (0,0,0); //black pixel for (int x = 0; x < bi.getWidth(); x++) { for (int y = 0; y < bi.getHeight(); y ++) { bi.setRGB(x, y, c.getRGB()); } } }
此辅助函数将图像完全转换为黑色。有很多种方法可以实现这一点,我建议您使用您最熟悉的方法。
public static java.awt.Rectangle ConvertRect (com.accusoft.ocrxpress.Rectangle accusoftRect) { java.awt.Rectangle javaRect = new java.awt.Rectangle(); javaRect.x = accusoftRect.getLeft(); javaRect.y = accusoftRect.getTop (); javaRect.width = accusoftRect.getRight() - accusoftRect.getLeft(); javaRect.height = accusoftRect.getBottom() - accusoftRect.getTop(); return javaRect; }
此辅助函数接收一个 Accusoft 矩形(包含 Top、Bottom、Right 和 Left),并将其转换为标准的 Java 矩形(x、y、width 和 height)。
public static void main (String[] args) throws OcrxException { String inputImagePath = "images/NP01.bmp"; BufferedImage originalImg = null, outputImg = null; //Load and display original image try { originalImg = ImageIO.read(new File (inputImagePath)); } catch (IOException e) { e.addSuppressed(e); return; }
一旦我扫描了报纸并将其保存为 BMP 图像,我就准备好通过调用 ImageIO.read
将我的图像加载到 bufferedImage
中了。
0crXpress ocrx = new 0crXpress(); initializeLicensing(ocrx); RecognitionParameters parameters = new RecognitionParameters(); parameters.setLanguage(Language.ENGLISH); Document document = ocrx.recognizeToMemory(parameters, original Img);
扫描图像为 BMP?检查。BMP 已加载为 bufferedimage
?检查。现在该进行下一步了。OCR Xpress 提供了几个选项:输出到文件、输出到 PDF 和输出到内存。为了我的需要,我想使用 recognizeToMemory
。我需要初始化 OCR Xpress 引擎和 RecognitionParameters
。然后我只需调用 recognizeToMemory
来将图像 OCR 到内存。
单词搜索
现在我的报纸已经转换成电子形式,我可以搜索单词/短语了。这还允许我找到每个单词/短语的矩形区域。我能够将这些添加到 RECT 列表中,然后将它们与我的“涂黑”页面合并。
String searchString = InputString(); if (searchString.isEmpty()) { searchString = "You give something possible by psychic sign passed forth on networks?"; } String[] searchWords = searchString.split("\\s+");
使用辅助函数 InputString
,我需要做的就是传入一个默认值,并使用 Java 的 split 函数填充字符串数组,可以使用用户的输入或默认值。
这是最困难的部分,我实际上不得不停下来思考一首诗,使用文章中给出的词语。
“你通过心灵感应信号,在网络上传递了什么东西?”好吧,不算最好,但写诗比写代码难得多。
编辑行动
下一步(似乎是最困难的)也变得容易了。首先,让我解释一下编辑及其用途。编辑是为了法律或安全目的对文本的一部分进行审查或模糊化处理的过程。当有人提到编辑时,您可能会想到绝密的“仅供您阅览”文件。然而,每家公司都有可能需要编辑的敏感材料,例如客户数据、公司数据或员工数据。然而,我的编辑需求更多的是“我爱你”的类型。文本被编辑后,我就能够将编辑的区域与转换为黑色的原始图像合并。
try { outputImg = ImageIO.read(new File (inputImagePath)); ConvertsToBlack(outputImg); } catch (IOException e) { e.addSuppressed(e); return; }
有几种不同的方法可以复制原始图像,但为了简单起见,我创建了一个新的 bufferedImage
outputImg
。对于此图像,我需要将所有像素转换为黑色。这就是 ConvertToBlack
辅助函数发挥作用的地方。
int curWord = 0; for (Word word : document.getWords()) { if (curWord >= searchWords.length) break; if (word.getText().equals(searchWords[curWord]) == false) continue; Raster img = originalImg.getData(ConvertRect(word.getArea())); outputImg.setsData(img); curWord++; } DisplayImage(outputImg); } }
我需要搜索每个单词并提取与图像坐标对应的区域。OCR Xpress 提供了一个 getArea()
函数,正是做了这个。我得到了我要搜索的单词的区域。我需要转换 RECT,获取像素数据,然后在移动到下一个单词之前,将数据设置到 outputImg
文件中。
然后我就可以显示我的报纸涂黑诗了。
结论
在您匆忙创建自己的报纸涂黑诗之前,让我们快速回顾一下上面提到的内容。我描述了 OCR 是什么,以及许多公司如何在日常实际应用中发现它非常有价值。我还回顾了编辑及其对公司和个人的益处。最后,我向您展示了如何将 OCR 和编辑用于一个有趣的项目。我鼓励您自己尝试这个项目,并将您的“艺术”一面与世界分享。
链接
您可以从以下链接下载 OCR Xpress 和此示例
OCR Xpress:https://www.accusoft.com/products/ocr-xpress/overview/。
要获取评估许可证,您需要联系 Accusoft 的支持。他们也将能够回答您可能有的任何问题。
OCR Xpress & 报纸涂黑应用程序:https://github.com/Accusoft/Programmable-Poetry-Using-OCR