OpenCV-去除图像噪声

5
我正在开发一个基于OpenCV库的Java图像处理程序。
我需要从第一张图片中去除噪音,得到像下面第二张图片那样清晰的图片。
在这种情况下,最好的去噪方法是什么? 最重要的部分是如何去除围绕图像的黑色部分。
第一张图片: enter image description here 第二张图片: enter image description here
2个回答

5
  1. 去除灰色: 对图像进行阈值处理,使任何灰色变为白色。
  2. 去除边框: 在位置(0,0)处使用洪水填充算法将边框用白色填充。
  3. 这将仅留下一些需要清理的问题:检测图像中的每个黑色斑点,如果一个斑点的面积小于某个值,使用洪水填充算法将斑点涂成白色。一种实现方法如下。 注意,洪水填充算法会返回它填充的像素数。这使您可以扫描黑色像素。当您找到一个时,使用灰色填充。如果填充的区域太小,则再次使用白色填充以删除该斑点,然后继续扫描。否则将斑点保留为灰色,并继续扫描黑色像素。最后,您需要将所有想要的内容变为灰色,所以再次扫描图像,并在发现灰色时使用洪水填充算法涂成黑色。

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


请不要使用已弃用的遗留API,但结果很好。 - Bull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接