如何检测图像中的斑点并将其裁剪成PNG文件?

4
我一直在开发一个Web应用程序。我遇到了一个问题,希望你能帮我解决。 我会尝试解释我想要做的事情。 这里有一个包含绿色形状的大图片。 我想做的是将这些形状裁剪成不同的PNG文件,并使它们的背景透明,就像下面大图之下的示例裁剪图像一样。

Main image the input

Cropped 1.

Cropped 2.

Cropped 3.

第一个图片将由用户上传,我想将其裁剪成像上面示例裁剪图像一样的小块。可以使用PHP的GD库或用Python或C#编写的服务器端软件来完成此操作,但我不知道这个操作叫什么,因此不知道要搜索哪些信息。这与计算机视觉检测斑点并将其裁剪成小块等操作有关。任何关键词或链接都将很有帮助。
感谢您的帮助。

期待一些困难的东西 :) - orlp
1
没问题 :) 我会努力学习的 :) - Max Abrahamsson
4个回答

5
一个非常简单的方法是使用泛洪填充/连通组件标记。基本上,这只是通过将任何颜色相同或相似的像素分组来使用贪心算法。
这绝对不是检测斑点的理想方法,并且只在有限的情况下有效。然而,它更容易理解和编码,可能已经足够满足您的需求。

谢谢你的帮助 :) 我会尽快开始阅读那些文章 :) - Max Abrahamsson

4

Opencv提供了一个名为cv::findContours的函数,用于在图像中查找连通组件。如果它总是绿色与白色之间的区别,您需要将图像分成通道,使用cv::threshold在蓝色或红色通道上(这些通道在白色区域中将是白色,在绿色区域附近将是接近黑色),并使用THRESH_BINARY_INV(因为您想要提取暗色区域),然后使用cv::findContours来检测斑点。然后可以使用cv::boundingRect计算边界矩形,并创建一个新的该大小的图像,使用所得到的轮廓作为掩模填充新图像。

注意:这些是指向C++文档的链接,但是这些函数应该在Python和C#包装器中公开 - 有关后者,请参见http://www.emgu.com

是的,背景始终是白色的,但形状不总是单色的。 - Max Abrahamsson
没问题,那么你可以将其转换为灰度图像,然后对该图像进行阈值处理。 - etarion

1

1

这真的取决于您将要处理哪种类型的图像。

正如Brian所提到的,您可以使用连通组件标记,通常应用于二进制图像,其中前景由白色像素表示,背景由黑色像素表示(或相反)。问题是如何将原始图像转换为二进制图像。如果所有图像都像您提供的示例一样,那么这很简单,可以通过阈值处理来完成。OpenCV提供了有用的方法:

然而,对于更复杂的图像,一切都无法预测。


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