如何使用Opencv和Python检测图像中的白色区域?

我尝试提取图像中一大片白色区域的坐标,如下所示:这是原始图像:

原始图像

使用一个小的方形核,我应用了闭合操作来填充小的孔洞,并帮助识别图像中的较大结构,如下所示:

import cv2import numpy as npimport imutils original = cv2.imread("Plates\\24.png")original = cv2.resize(original, None, fx=3, fy=3, interpolation=cv2.INTER_CUBIC)gray = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)    # 接下来,查找图像中为光的区域squareKern = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))light = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, squareKern)light = cv2.threshold(light, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

处理后的图像如下:

处理后图像1

另一个例子如下:

处理后图像2

我希望能够检测到盘子中的大片白色区域,如下所示:

所需输出

请注意,轮廓方法在许多例子中可能效果不佳


回答:

对于您提供的一张图像:

输入图像描述

我提出了两种解决这个问题的方案:

方案1

轮廓面积比较

如您所见,图像中有三个大的轮廓;顶部的矩形和下面的两个矩形,您希望将其整体检测出来。

所以我对您的图像进行了阈值处理,检测了阈值处理后图像的轮廓,并索引了第二大和第三大的轮廓(最大的是顶部的矩形,您希望忽略它)。

这是阈值处理后的图像:

输入图像描述

我将这两个轮廓堆叠在一起,并检测了这两个轮廓的边界框:

输出:

输入图像描述


方案2

阈值掩码

由于盘子底部的两个矩形比顶部的矩形更白,我使用了一个阈值来遮蔽盘子的顶部:

输入图像描述

我在上图所示的掩码上使用了Canny边缘检测器。

输出:

输入图像描述

当然,如果盘子的顶部不比底部更亮,这种方法可能无法正常工作。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注