- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为 android 开发一个 OCR 应用程序(构建为 java 应用程序)。我想从相机捕获的图像中检测文本并进行预处理我正在使用 OpenCV,但我得到了一些额外的行,这些行被读取为文本,我采用了这种方法:
1-RGB 到灰度2-阈值3-高斯模糊4-中值模糊5-扩张6-侵 eclipse
结果至少比以前好,但仍然没有得到正确的结果。我怎样才能消除这种噪音,像这样的过滤器的一般序列是什么,可以应用于任何图像以改善 OCR 的结果。我是 OpenCV 的新手,所以请指导我。谢谢。
从上图中我可以找到 3 号的结果,但只有当所有轮廓都被绘制出来时,这是我不想要的东西,因为还有噪音。我在这里错过了什么。不知道该怎么做。修改后的代码:
package simple_contours;
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
public class Main {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat src_img,src_grey,src_blur,src_thresh,src_dilate,dest_img;
src_img=Highgui.imread("n_num.jpg",Imgproc.COLOR_BGR2GRAY);
src_grey=new Mat(src_img.size(), Core.DEPTH_MASK_8U);
src_blur=new Mat(src_img.size(), Core.DEPTH_MASK_8U);
src_thresh=new Mat(src_img.size(), Core.DEPTH_MASK_8U);
src_dilate=new Mat(src_img.size(), Core.DEPTH_MASK_8U);
dest_img=Mat.zeros(640,480, CvType.CV_8UC3);
Core.bitwise_not(dest_img, dest_img);
Highgui.imwrite("dest.jpg", dest_img);
Imgproc.cvtColor(src_img, src_grey, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(src_grey, src_blur, new Size(3, 3), 0);
Imgproc.threshold(src_blur, src_thresh, 80, 255, Imgproc.THRESH_BINARY_INV);
Imgproc.dilate(src_thresh, src_dilate, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2, 2)));
Highgui.imwrite("Threshold.jpg", src_thresh);
Highgui.imwrite("Dilate.jpg", src_dilate);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat heirarchy= new Mat();
Point shift=new Point(150,0);
Imgproc.findContours(src_dilate, contours,heirarchy, Imgproc.RETR_TREE,Imgproc.CHAIN_APPROX_SIMPLE,shift);
double[] cont_area =new double[contours.size()];
for(int i=0; i< contours.size();i++)
{
Rect rect = Imgproc.boundingRect(contours.get(i));
cont_area[i]=Imgproc.contourArea(contours.get(i));
System.out.println("Hight: "+rect.height);
System.out.println("WIDTH: "+rect.width);
System.out.println("AREA: "+cont_area[i]);
//System.out.println(rect.x +","+rect.y+","+rect.height+","+rect.width);
Core.rectangle(src_img, new Point(rect.x,rect.y), new Point(rect.x+rect.width,rect.y+rect.height),new Scalar(0,0,255));
Imgproc.drawContours(dest_img, contours, i, new Scalar(0,0,0),-1,8,heirarchy,2,shift);
Core.rectangle(dest_img, new Point(rect.x,rect.y), new Point(rect.x+rect.width,rect.y+rect.height),new Scalar(0,255,0));
}
Highgui.imwrite("Final.jpg", dest_img);
Highgui.imwrite("Original.jpg", src_img);
}
}
最佳答案
我认为您只能使用侵 eclipse /扩张选项走这么远。问题是噪音不仅仅是噪音,还包含不一定与您尝试检测的某些字符不同的 Artifact 。
我建议解决方案需要涉及检测图像中的轮廓。首先,您应该准备好图像,使其更易于轮廓绘制过程的管理。
我过去使用过以下序列:
现在您可以找到轮廓。这应该挑出字母和不需要的 Artifact 。然后您需要消除 Artifact ,您可能需要多种策略,例如:
可能有更复杂的方法,例如尝试找到穿过较大轮廓中间的轴,这将为您提供字符的位置和方向(比如旋转的矩形);您可以使用该信息来忽略不在区域中的所有其他像素。
抱歉,这不是一个简单的解决方案,而是一个复杂的问题,因此您可能需要进行一些试验并制定多种策略来移除不需要的 Artifact 。
关于java - 如何去除 OpenCV 中不需要的线条/噪音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22898996/
给定一个字符串"5 900 000" 我想通过以下模式使用 gsub 去除空格: gsub(/\s/, '') 但这似乎行不通。也没有: gsub(' ', '') 最佳答案 如果你想就地替换,你需要
我编写了一个程序来抓取网站以获取数据并输出到 Excel 表。该程序使用 Microsoft Visual Studio 2010 用 C# 编写。 大多数时候,我从网站获取内容、解析内容并将数据存储
在 MS Access 2007 项目报告中,我有以下(已编辑)查询: SELECT SomeCol FROM SomeTable 问题是, SomeCol 显然包含一些不可见的字符。例如,我看到一个
如 Removing left recursion 中所述,有两种方法可以去除左递归。 使用一些过程修改原始语法以删除左递归 写文法原来没有左递归 人们通常使用什么来删除(没有)ANTLR 的左递归?
我在 CoreData 中存储了一堆艺术家,并希望按名称对它们进行排序,但忽略前缀“the”。例如,“The Beatles”将被排序为“Beatles”,有点像 iTunes/iPod 的做法。 因
我有一个 WebView ,我想从中删除弹性。现在,当滚动小于 webview 的页面时,它会产生弹性效果,显示下面的背景。我想删除这个。 我尝试过执行以下操作,但没有成功。它找到了 WebDynam
我正在调查我们公司使用 Prometheus 从我们在 Kubernetes 上运行的实验中收集统计数据。有计划使用标签来标记我们的云/集群中特定实验的名称。这意味着我们将生成大量标签,这些标签会随着
我正在添加聚合物元素。我想在单击其(自己的)图像时删除元素(自我)。根据封装,我将不得不让 parent 删除 child 。但这也需要为母体生成聚合物元素(我在这里吗??)。 children.ad
现在如果我点击按钮 A,按钮 B 会显示 DropShadow 效果: Private Sub ButtonA_Click(ByVal sender As System.Object, ByVal
我尝试过这个,但它对我不起作用: char * remove_nl(char * newstr) { newstr = strdup(newstr); newstr[strlen(ne
我陷入了两难境地。我有一个图像,我想占据网页的背景。我希望它横跨屏幕的宽度和高度,并保持那个尺寸。当我使用 标签,我不知道如何将它拉伸(stretch)到没有白条的屏幕上。 wspace 和 hspa
Jade .foo .foo 结果 想要的结果 在 haml 中我会做类似 .foo>< 的事情但这在 Jade 中不起作用。我已经搜索并空手而归如何处理这个问题。我如何达到预期的结果
我是 Maven 的新手,当我尝试将我当前的项目从使用 Ant 转换为 -> 使用 Maven 时遇到了问题。 那个项目需要很多 Jar,我在 mvnrepository 上查找这些 jar 并将它们
我需要一个正则表达式来删除 xml 标记开头和结尾之间的空格。例如:有人创建 xml 并将其发送给我,这样我就可以验证、签名并发送到网络服务。 为此,我需要删除标签开头和结尾之间的空格: String
我写了几个方法来将项目添加到数组中,如果它们已经在数组中,它们将被忽略。在对数据结构做了一些研究之后,我意识到我可以通过简单地将它们放在一个集合中来摆脱重复(特别是因为我不关心对象的顺序)。然而,在玩
使用 HighCharts,我想移除 SVG 曲线上的抗锯齿。 到目前为止,我正在使用这个: $('path').each(function(i,j){$(j).attr('shape-renderi
由于某些奇怪的原因(黑色但不是黑色部分),我的 SeekBar 和拇指后面出现随机阴影。我该如何摆脱它? 我的搜索栏: 拇指.xml progress_appearance.xml(有一些
我有一个 Url,我想获取路径部分但没有尾随文件名。如果 Url 是 http://my.com/dir1/dir2/file.ext 那么我想获取 /dir1/dir2 . 我已经尝试了各种拆分(l
我有这个字符串: dataSourceURL = URL(string:"https://api.abc.com/api/p4/products?pid=uid8225&format=json&off
在我的网页中,我有一个菜单 (HorizontalPanel) 应该隐藏在页面的底部。为此,我尝试使用 RootLayoutPanel 类并在其中添加一个 south 小部件,我成功地做到了。但问
我是一名优秀的程序员,十分优秀!