C++ 图像处理算法idea-Opencv

C++ 图像处理算法idea-Opencv,c++,image,algorithm,opencv,C++,Image,Algorithm,Opencv,我正试图分离粗面粉中的小物体(黑色物体),如下图所示。我在C++中使用OpenCV 3.1。 我尝试了不同的方法,我发现最好的方法如下。但是结果不是我想要的那么好。 我只想在决赛中有我的黑色物体 原始图像: 所以我把我的图像转换成灰度,然后应用高斯模糊和大模糊来获得背景 GaussianBlur(img_gray, img_inter, Size(21, 21), 0, 0); blur(img_inter, img_blur, Size(51, 51), Point(-1,-1), 0);

我正试图分离粗面粉中的小物体(黑色物体),如下图所示。我在C++中使用OpenCV 3.1。 我尝试了不同的方法,我发现最好的方法如下。但是结果不是我想要的那么好。 我只想在决赛中有我的黑色物体

原始图像:

所以我把我的图像转换成灰度,然后应用高斯模糊和大模糊来获得背景

GaussianBlur(img_gray, img_inter, Size(21, 21), 0, 0);
blur(img_inter, img_blur, Size(51, 51), Point(-1,-1), 0);
背景图像:

之后,我将背景减去原始图像:

减影图像:

以及打开操作、阈值和再次打开后的最终图像:

结果图像:

代码如下:

cvtColor(*img_in, img_gray, CV_BayerGB2GRAY);

GaussianBlur(img_gray, img_inter, Size(21, 21), 0, 0);

blur(img_inter, img_blur, Size(51, 51), Point(-1,-1), 0);

img = (255 - img_gray) - (255 - img_blur); // Background subtraction

morphologyEx(img, img_inter, cv::MORPH_OPEN, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3)),Point(-1,-1), 1);
threshold(img_inter, img, 50, 255, CV_THRESH_BINARY);
morphologyEx(img, img_inter, cv::MORPH_OPEN, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3)), Point(-1, -1), 1);

如果您有任何改进结果的想法,谢谢您。一般的方法看起来已经很好了。你到底想要什么,改进?只是警告你,因为你是新来的,但你很可能会把你的问题关闭,因为它没有一个确切的答案。黑色对象总是在这种配置中吗?(在顶部,平面)如果是这样的话,你也可以通过一些模式匹配得到一些好的结果,也许?谢谢你jlengrand,是的,我的对象几乎总是这样。我想保持处理简单,因为我需要良好的输出fps。在最终的图像中,有一些我不想要的噪声点,如果不删除好的点,我无法删除它们。好的,你可以让模式匹配尽可能简单。从外观上看,您正在搜索的对象是长的、薄的和黑色的。因此,对于您现在的最终输出,我将尝试与原始图像颜色进行比较,看看它是否匹配黑色物体,尝试查看对象有多长,以及它与残差的通常大小相匹配(它将删除您的大部分小点),也许要做一个细度/长度检查,并对每个物体的元素做一些评分。这应该很快:)。而不是模糊锐化图像,然后再试一次。