Java OpenCV去除图像中的噪声

Java OpenCV去除图像中的噪声,java,image,opencv,image-processing,Java,Image,Opencv,Image Processing,我正在开发一个java图像处理程序(基于OpenCV库) 我需要去除第一幅图像中的噪声,以获得一幅干净的图像,如下面的第二幅图像 在这种情况下,消除噪音的最佳方法是什么? 最重要的部分是如何去除图像周围的黑色部分 第一张图片: 第二张图片: 去除灰色:使图像中的任何灰色变为白色 去除边框:在位置(0.0)处使用白色 这将只剩下几个剩下的问题需要清理:检测图像中的每个黑色斑点,如果斑点的面积小于一定量,则用白色填充斑点。实现这一点的一种方法如下。 请注意,floodfill返回其填充的像素数。

我正在开发一个java图像处理程序(基于
OpenCV库

我需要去除第一幅图像中的噪声,以获得一幅干净的图像,如下面的第二幅图像

在这种情况下,消除噪音的最佳方法是什么? 最重要的部分是如何去除图像周围的黑色部分

第一张图片:

第二张图片:

  • 去除灰色:使图像中的任何灰色变为白色
  • 去除边框:在位置(0.0)处使用白色
  • 这将只剩下几个剩下的问题需要清理:检测图像中的每个黑色斑点,如果斑点的面积小于一定量,则用白色填充斑点。实现这一点的一种方法如下。 请注意,floodfill返回其填充的像素数。这允许您在发现一个填充为灰色时扫描黑色像素。如果填充的区域太小,请再次填充白色以擦除斑点,然后继续扫描,否则将斑点保留为灰色并继续扫描黑色。在最后,你想要的一切都是灰色的,所以再次扫描图像,每当你发现灰色洪水填充黑色

  • 以下程序可能有助于解决您的问题, 该程序对输入图像设置阈值,并仅选择“已连接” 特殊尺寸的部件

    #include <iostream>
    #include<cv.h>
    #include<highgui.h>
    
    using namespace std;
    using namespace cv;
    int main(int argc, char *argv[])
    {
      IplImage *img1 = cvLoadImage(argv[1] , 0);
      IplImage *img3 = cvLoadImage(argv[1]);
      IplImage *img2 = cvCloneImage(img1);
    
      cvNamedWindow("Orig"); 
      cvShowImage("Orig",img1);
      cvWaitKey(0);
    
      cvAdaptiveThreshold(img1, img1, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C,
                                     CV_THRESH_BINARY_INV, 15);
      cvNamedWindow("Thre"); 
      cvShowImage("Thre",img1);
      cvWaitKey(0);
    
      IplImage *tempImg = cvCloneImage(img1);
      CvMemStorage *storage = cvCreateMemStorage(0);
      CvSeq *contour = NULL;
      cvFindContours(tempImg, storage, &contour, sizeof(CvContour),
          CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
    
      for (; contour != 0; contour = contour->h_next)
      {
        CvRect r = cvBoundingRect(contour);
    
        int area = r.width * r.height;
        if (area < 50 || area > 500) continue;
    
        cvRectangle(img3, cvPoint(r.x, r.y), cvPoint(r.x + r.width, r.y + r.height),
                      CV_RGB(255, 0, 0), 1);
      }
      cvNamedWindow("D");
      cvShowImage("D",img3);
      cvWaitKey(0);
    }
    
    #包括
    #包括
    #包括
    使用名称空间std;
    使用名称空间cv;
    int main(int argc,char*argv[])
    {
    IplImage*img1=cvLoadImage(argv[1],0);
    IplImage*img3=cvLoadImage(argv[1]);
    IplImage*img2=cvCloneImage(img1);
    cvNamedWindow(“原”);
    cvShowImage(“原始”,img1);
    cvWaitKey(0);
    cvAdaptiveThreshold(img1、img1、255、CVU自适应阈值、高斯阈值、,
    CV_阈值_二进制_INV,15);
    CVD公司(“Thre”);
    cvShowImage(“Thre”,img1);
    cvWaitKey(0);
    IplImage*tempImg=cvCloneImage(img1);
    CvMemStorage*storage=cvCreateMemStorage(0);
    CvSeq*轮廓=空;
    cvFindContours(温度、存储和轮廓、尺寸)(CvContour),
    CV_RETR_CCOMP,CV_CHAIN_近似_简单);
    对于(;轮廓!=0;轮廓=轮廓->h_下一步)
    {
    CvRect r=cvBoundingRect(轮廓);
    内部面积=r.宽度*r.高度;
    如果(面积<50 | |面积>500)继续;
    cv矩形(img3,cvPoint(r.x,r.y),cvPoint(r.x+r.width,r.y+r.height),
    CV_RGB(255,0,0,1);
    }
    CVD;
    cvShowImage(“D”,img3);
    cvWaitKey(0);
    }
    


    请不要使用不推荐使用的旧API,但效果不错。