如何检测圣诞树?

17 浏览
0 Comments

如何检测圣诞树?

如何使用图像处理技术来实现一个能够检测以下图像中的圣诞树的应用程序?

我正在寻找适用于所有这些图像的解决方案。因此,需要进行haar级联分类器的训练或者模板匹配的方法并不是很有趣。

我正在寻找一种可以用任何编程语言编写的解决方案,只要它使用的是开源技术。该解决方案必须使用这个问题中共享的图像进行测试。输入图像共有6张,答案应显示每张图像的处理结果。最后,对于每个输出图像,必须绘制红色线条以包围检测到的树。

你会如何通过编程方式检测这些图像中的树木?

0
0 Comments

如何检测圣诞树?

下面是一个考虑了物体亮度和形状的方法。换句话说,它寻找具有三角形状和明显亮度的物体。它使用Java实现,使用了Marvin图像处理框架。

第一步是颜色阈值处理。这里的目标是将分析集中在具有显着亮度的物体上。

第二步,对图像中最亮的点进行膨胀以形成形状。这个过程的结果是具有显着亮度的物体的可能形状。应用泛洪填充分割,检测到不连通的形状。

接下来,对每个类似三角形的形状进行分析。一个简单的算法检测到具有类似三角形的模式的形状。该算法逐行分析物体形状。如果每个形状线的质心几乎相同(给定一个阈值),并且随着y的增加,质量增加,那么物体具有类似三角形的形状。形状线的质量是属于该形状的该行中的像素数。想象一下,你在水平上切割了物体并分析了每个水平段。如果它们相互集中并且长度从第一个段到最后一个段以线性模式增加,那么你可能有一个类似三角形的物体。

最后,突出显示与类似三角形和显着亮度的形状(在这种情况下是圣诞树)相对应的每个形状的位置。

这种方法的优点是它可以处理包含其他发光物体的图像,因为它分析了物体的形状。

文章已经整理完成,输出如下:

如何检测圣诞树?

下面是一个考虑了物体亮度和形状的方法。换句话说,它寻找具有三角形状和明显亮度的物体。它使用了Java编程语言中的图像处理框架Marvin。

首先,对图像进行颜色阈值处理,目的是将分析集中在具有显着亮度的物体上。

接下来,对图像中最亮的点进行膨胀,以形成物体的形状。这个过程的结果是具有显着亮度的物体的可能形状。通过泛洪填充分割算法,检测到不连通的形状。

然后,对每个类似三角形的形状进行分析。算法逐行分析物体的形状。如果每个形状线的质心几乎相同,并且随着y的增加,质量也增加,那么该物体具有类似三角形的形状。

最后,将与类似三角形和明显亮度的形状相对应的物体位置突出显示在原始图像中。

这种方法的优点是它可以处理包含其他发光物体的图像,因为它分析了物体的形状。

祝大家圣诞快乐!

0
0 Comments

如何检测圣诞树?

圣诞树检测的问题是因为有人提出了这个问题,希望能够通过图像处理的方法来检测圣诞树。文章中给出了一种有趣且与众不同的方法,主要区别在于图像分割步骤的执行方式。作者使用了Python的scikit-learn库中的DBSCAN聚类算法,该算法在寻找不规则形状方面有优化,不需要单一的明确的质心。

作者的方法可以简单地分为三个步骤。首先,应用阈值进行二值化处理,通过亮度测试确定亮度在一定阈值以上的像素点。然后,通过转换为HSV空间,筛选出色调在黄绿色和蓝紫色之间或者大于红紫色边界的像素点,并且饱和度和亮度都要达到一定的阈值。最后,将两个阈值的结果进行逻辑“或”运算,得到一个二值化的图像。

通过上述处理,可以看到每个图像中有一个大的像素簇大致对应着每棵树的位置,还有一些其他小的簇对应着窗户上的灯光或者地平线上的背景。下一步是将这些簇识别出来,并使用一个簇标签来正确地标记每个像素点。

为了完成这个任务,作者选择了DBSCAN算法。该算法需要设置一个“接近度”参数,以控制测试点与已经存在的簇之间的距离。作者将该值设置为图像对角线长度的0.04倍。由于图像的大小从VGA到HD 1080不等,这种相对比例的定义是至关重要的。

需要注意的是,scikit-learn中实现的DBSCAN算法对于一些较大的图像来说,内存限制相当具有挑战性。因此,对于一些较大的图像,作者实际上需要通过“抽取”(只保留每隔3个或4个像素点,舍弃其他的)来减少每个簇的像素点数量,以满足内存限制。因此,在一些较大的图像上,剩余的个别稀疏像素点在显示上可能难以看到。为了更好地展示,上述图像中的彩色像素点被微调了一点,使其更加醒目。这只是为叙述的目的而进行的纯粹的美化操作;尽管我的代码中有提到这种膨胀,但请放心,它与实际计算无关。

一旦识别和标记了簇,第三步就很简单了:只需取每个图像中最大的簇(在这种情况下,通过像素点的总数来衡量“大小”),并计算该簇的凸包。凸包就成为了树的边界。通过这种方法计算出的六个凸包如下所示。

以上是作者对于如何检测圣诞树的解决方法的整理和总结。作者通过图像分割和聚类的方法,结合阈值处理和DBSCAN算法,成功地识别并标记出圣诞树的位置,得到了圣诞树的边界。这种方法在处理不规则形状的图像上表现出很好的效果,是一种较为优雅和独特的解决方案。

0
0 Comments

如何检测圣诞树?

这是我的简单而愚蠢的解决方案。它基于这样一个假设,即树将是图片中最亮和最大的物体。

我们首先要检测图片中最亮的像素,但我们必须区分树本身和反射其光线的雪。在这里,我们尝试通过对颜色代码应用一个非常简单的过滤器来排除雪:

GaussianBlur(original, tmp, Size(3, 3), 0, 0, BORDER_DEFAULT);
erode(tmp, tmp, Mat(), Point(-1, -1), 10);
cvtColor(tmp, tmp, CV_BGR2HSV);
inRange(tmp, Scalar(0, 0, 0), Scalar(180, 255, 200), tmp);

然后我们找到每个“亮”像素:

dilate(original, tmp1, Mat(), Point(-1, -1), 15);
cvtColor(tmp1, tmp1, CV_BGR2HLS);
inRange(tmp1, Scalar(0, 185, 0), Scalar(180, 255, 255), tmp1);
dilate(tmp1, tmp1, Mat(), Point(-1, -1), 10);

最后,我们将这两个结果合并:

bitwise_and(tmp, tmp1, tmp1);

现在我们寻找最大的亮物体:

findContours(tmp1, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
max_area = 0;
j = 0;
for(k = 0; k < contours.size(); k++)
{
    tmp_area = contourArea(contours[k]);
    if(tmp_area > max_area)
    {
        max_area = tmp_area;
        j = k;
    }
}
tmp1 = Mat::zeros(original.size(),CV_8U);
approxPolyDP(contours[j], contours[j], 30, true);
drawContours(tmp1, contours, j, Scalar(255,255,255), CV_FILLED);

现在我们几乎完成了,但由于雪的原因仍然存在一些瑕疵。为了去除它们,我们将使用一个圆和一个矩形来构建一个蒙版,以近似树的形状来删除不需要的部分:

m = moments(contours[j]);
boundrect = boundingRect(contours[j]);
center = Point2f(m.m10/m.m00, m.m01/m.m00);
radius = (center.y - (boundrect.tl().y))/4.0*3.0;
Rect heightrect(center.x-original.cols/5, boundrect.tl().y, original.cols/5*2, boundrect.size().height);
tmp = Mat::zeros(original.size(), CV_8U);
rectangle(tmp, heightrect, Scalar(255, 255, 255), -1);
circle(tmp, center, radius, Scalar(255, 255, 255), -1);
bitwise_and(tmp, tmp1, tmp1);

最后一步是找到树的轮廓并在原始图片上绘制它:

findContours(tmp1, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
max_area = 0;
j = 0;
for(k = 0; k < contours.size(); k++)
{
    tmp_area = contourArea(contours[k]);
    if(tmp_area > max_area)
    {
        max_area = tmp_area;
        j = k;
    }
}
approxPolyDP(contours[j], contours[j], 30, true);
convexHull(contours[j], contours[j]);
drawContours(original, contours, j, Scalar(0, 0, 255), 3);

对不起,由于我目前的网络连接不好,所以我无法上传图片。我稍后会尝试上传。

圣诞快乐。

编辑:这是最终输出的一些图片:

![图片1](https://i.stack.imgur.com/rAyBQ.png)

![图片2](https://i.stack.imgur.com/nKwd6.png)

![图片3](https://i.stack.imgur.com/32gJ3.png)

![图片4](https://i.stack.imgur.com/mQruL.png)

![图片5](https://i.stack.imgur.com/0iAXn.png)

![图片6](https://i.stack.imgur.com/x7lsP.png)

你好!请确保你的回答满足所有要求:有6个输入图片,答案应该显示每个图片处理的结果。

嗨!你可以将文件名作为命令行参数传递给我的程序:./christmas_tree ./*.png。你可以随意输入任意数量的文件名,结果会按顺序显示,按任意键继续下一个。这样做有什么问题吗?

这样做没问题,但你仍然需要上传这些图片并在问题中分享它们,这样线程的观看者才能真正“看到”你的结果。让人们看到你做的事情会提高你得到赞成票的机会。

我正在努力解决这个问题,我遇到了一些连接问题。

我已经上传了一些图片。

太棒了!现在你可以在回答中使用以下代码调整图片的大小:<img src="http://i.stack.imgur.com/nmzwj.png" width="210" height="150">只需更改图片的链接即可。

谢谢!我不知道我可以直接使用HTML标签。

0