OpenCV去除图像中的噪声

时间:2014-08-02 21:19:25

标签: java image opencv image-processing

我正在处理一个java图像处理程序(基于OpenCV library)。

我需要从第一张图片中删除噪点,以获得干净的图像,如下图所示。

此特定情况中,消除噪音的最佳方法是什么? 最重要的部分是如何去除图像周围的黑色部分。

第一张图片:

enter image description here

第二张图片:

enter image description here

2 个答案:

答案 0 :(得分:5)

  1. 摆脱灰色:threshold 图像,以便任何灰色变为白色
  2. 摆脱边框:floodfill位置(0.0)白色
  3. 这将留下一些剩余的问题要清理:检测图像中的每个黑色斑点,如果斑点的面积小于某些量,则用白色填充斑点。实现该方法的一种方法如下。 请注意,floodfill返回它填充的像素数。当您找到一个灰色填充时,这允许您扫描黑色像素。如果填充的太小,则再次填充白色以擦除斑点然后继续扫描,否则将斑点保持为灰色并继续扫描为黑色。最后,您想要的一切都是灰色的,因此每当您发现灰色填充黑色时,再次扫描图像。

答案 1 :(得分:1)

以下程序可能有助于解决您的问题, 该程序对输入图像进行阈值处理并仅选择已连接  具有特定大小的组件

#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);
}

Thresholded Image

Output