Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何删除OpenCV中不需要的线条/噪波?_Java_Android_C++_Opencv - Fatal编程技术网

Java 如何删除OpenCV中不需要的线条/噪波?

Java 如何删除OpenCV中不需要的线条/噪波?,java,android,c++,opencv,Java,Android,C++,Opencv,我正在为android开发一个OCR应用程序(构建为java应用程序)。我想从相机拍摄的图像中检测文本,为了进行预处理,我使用OpenCV,但我得到了一些额外的行,这些行被读取为文本,我采用了以下方法: 1-RGB到灰度 双阈值 3-高斯模糊 4-中值模糊 5-扩张 6-侵蚀 结果至少比以前好,但仍然没有得到正确的结果。 我怎样才能消除这种噪声,像这样的过滤器的一般序列是什么,可以应用于任何图像以改善OCR的结果。 我是OpenCV的新手,请指导我。 谢谢 从上面的图像中,我可以找到3号

我正在为android开发一个OCR应用程序(构建为java应用程序)。我想从相机拍摄的图像中检测文本,为了进行预处理,我使用OpenCV,但我得到了一些额外的行,这些行被读取为文本,我采用了以下方法:

1-RGB到灰度 双阈值 3-高斯模糊 4-中值模糊 5-扩张 6-侵蚀

结果至少比以前好,但仍然没有得到正确的结果。 我怎样才能消除这种噪声,像这样的过滤器的一般序列是什么,可以应用于任何图像以改善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);
    }

}
简单包装;
导入java.util.ArrayList;
导入java.util.List;
导入org.opencv.core.core;
导入org.opencv.core.CvType;
导入org.opencv.core.Mat;
导入org.opencv.core.MatOfPoint;
导入org.opencv.core.Point;
导入org.opencv.core.Rect;
导入org.opencv.core.Scalar;
导入org.opencv.core.Size;
导入org.opencv.highgui.highgui;
导入org.opencv.imgproc.imgproc;
公共班机{
公共静态void main(字符串[]args){
System.loadLibrary(Core.NATIVE\u LIBRARY\u NAME);
Mat src_img、src_grey、src_blur、src_thresh、src_deplate、dest_img;
src_img=Highgui.imread(“n_num.jpg”,Imgproc.COLOR_bgr2 gray);
src_grey=新垫(src_img.size(),Core.DEPTH_MASK_8U);
src_blur=新垫(src_img.size(),Core.DEPTH_MASK_8U);
src_thresh=new Mat(src_img.size(),Core.DEPTH_MASK_8U);
src_deplate=新垫(src_img.size(),Core.DEPTH_MASK_8U);
dest_img=材料零点(640480,CvType.CV_8UC3);
Core.bitwise_not(dest_img,dest_img);
Highgui.imwrite(“dest.jpg”,dest_img);
Imgproc.cvt颜色(src_img,src_grey,Imgproc.COLOR_bgr2 gray);
高斯模糊(src_灰,src_模糊,新尺寸(3,3),0);
Imgproc.threshold(src_blur,src_thresh,80255,Imgproc.thresh_BINARY_INV);
Imgproc.diplate(src_thresh,src_diplate,Imgproc.getStructuringElement(Imgproc.morp_RECT,新大小(2,2));
imwrite(“Threshold.jpg”,src_thresh);
imwrite(“displate.jpg”,src_displate);
列表等高线=新的ArrayList();
Mat继承权=新Mat();
点位移=新点(150,0);
Imgproc.findContours(src_扩张、等高线、继承权、Imgproc.RETR_树、Imgproc.CHAIN_近似、移位);
double[]cont_area=新的double[courts.size()];
对于(int i=0;i
尝试腐蚀图像(测试内核大小),然后放大恢复

如果线条/像素噪声(剩余噪声或原始噪声)非常小,请尝试对其进行中值模糊
它应该可以工作,如果不行,请分享您的结果以进一步工作。

我认为您只能使用腐蚀/扩张选项。问题在于,噪音不仅仅是噪音,它还包含一些人工制品,这些人工制品不一定与您试图检测的某些字符有什么不同

我建议解决方案需要检测图像中的轮廓。首先,您应该准备图像,使其更易于管理的轮廓过程

我过去使用过以下顺序:

  • 高斯模糊
  • 自适应阈值
  • 负图像
  • 扩张
现在你可以找到恐龙了。这应该能识别出字母和不受欢迎的人工制品。然后,您需要消除人工制品,这可能需要一些策略,例如:

  • 计算出边界框的面积,并消除那些面积太小而无法成为字母的区域
  • 检查边界框的宽度与高度:排除高度过小的边界框
可能会有更复杂的方法,例如试图找到穿过较大轮廓中间的轴,这将为您提供角色的位置和方向(例如旋转矩形);您可以使用该信息忽略该区域以外的所有其他像素


很抱歉,这不是一个简单的解决方案,但它是一个复杂的问题,因此您可能需要进行一些试验,并建立多种策略来删除不需要的文物。

我使用继承人的信息解决了这个问题,第四个索引值包含有关父轮廓的信息,因此,应绘制具有-1值的轮廓。这解决了填充轮廓问题。:)

尝试腐蚀图像(尝试内核大小),然后拨打Ate谢谢回复,我将按照您提到的内容进行操作,并会返回任何进度。我已找到轮廓,但似乎无法正确绘制轮廓。请您查看更新后的图像,以了解详情