Java OpenCV去除图像中的噪声
我正在开发一个java图像处理程序(基于Java OpenCV去除图像中的噪声,java,image,opencv,image-processing,Java,Image,Opencv,Image Processing,我正在开发一个java图像处理程序(基于OpenCV库) 我需要去除第一幅图像中的噪声,以获得一幅干净的图像,如下面的第二幅图像 在这种情况下,消除噪音的最佳方法是什么? 最重要的部分是如何去除图像周围的黑色部分 第一张图片: 第二张图片: 去除灰色:使图像中的任何灰色变为白色 去除边框:在位置(0.0)处使用白色 这将只剩下几个剩下的问题需要清理:检测图像中的每个黑色斑点,如果斑点的面积小于一定量,则用白色填充斑点。实现这一点的一种方法如下。 请注意,floodfill返回其填充的像素数。
OpenCV库
)
我需要去除第一幅图像中的噪声,以获得一幅干净的图像,如下面的第二幅图像
在这种情况下,消除噪音的最佳方法是什么?
最重要的部分是如何去除图像周围的黑色部分
第一张图片:
第二张图片:
以下程序可能有助于解决您的问题, 该程序对输入图像设置阈值,并仅选择“已连接” 特殊尺寸的部件
#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,但效果不错。