在大学里,我们接到了一项作业,在给定图像的情况下,我们必须识别“图形”、它们的颜色以及其中的“像素组”数量。让我解释:
上图有一个 图 (在图像中可以有多个数字,但让我们暂时忘记这一点)。
我们得到了一个能够拍摄图像并将它们转换为矩阵的类(每个元素都是一个代表像素颜色的整数)。
就是这样。我正在用 Java 做这件事。
到目前为止我做了什么
initialPixel
从现在开始。 initialPixel
在我提供的图像中,是图左上角的黑色像素。我故意在那里做了一个锐利的剪裁来说明它。 但是我很难找到这样的背景颜色(白色)。这是我所做的最接近的方法,它适用于某些情况 - 但不适用于此图像:
initialPixel
.听起来是个好主意 - 它有时确实有效,但它不适用于提供的图像:在这种情况下它将返回黄色,因为 initialPixel
与图的内容相差甚远。 假设我确实找到了图形的背景颜色(白色),我的下一个任务是意识到图形中存在两个像素组。这个似乎更容易:
我需要什么
是的,我的问题是关于如何根据我之前描述的内容找到图形的背景颜色(请记住,它可以与整个图像的背景颜色相同 - 现在它是黄色,但也可以是白色)。
我不需要任何代码——我只是在想一个合适的算法时遇到了麻烦。边界可以有如此奇怪的不规则线条这一事实让我很伤心。
或者甚至更好:我一直做错了吗?也许我不应该太关注那个
initialPixel
根本。也许一种不同的初始方法会起作用?是否有任何关于此类主题的文档/示例?我意识到有很多关于“计算机视觉”等的研究,但我找不到关于这个特定问题的太多信息。一些代码
我用所有数字检索 vector 的函数:
*注:
Figure
只是一个包含一些值的类,比如背景颜色和元素数量。public Figure[] getFiguresFromImage(Image image) {
Figure[] tempFigures = new Figure[100];
int numberOfFigures = 0;
matrixOfImage = image.getMatrix();
int imageBackgroundColor = matrixOfImage[0][0];
int pixel = 0;
for (int y = 0; y < matrixOfImage.length; ++y) {
for (int x = 0; x < matrixOfImage[0].length; ++x) {
pixel = matrixOfImage[y][x];
if (!exploredPixels[y][x]) {
// This pixel has not been evaluated yet
if (pixel != imageBackgroundColor ) {
// This pixel is different than the background color
// Since it is a new pixel, I assume it is the initial pixel of a new figure
// Get the figure based on the initial pixel found
tempFigures[numberOfFigures] = retrieveFigure(y,x);
++numberOfFigures;
}
}
}
}
// ** Do some work here after getting my figures **
return null;
}
那么,显然,函数
retrieveFigure(y,x)
是我无法做到的。备注:
最佳答案
解决此问题的一个好方法是将图像视为 graph ,其中每个颜色填充区域都有一个节点(本答案中的“组件”)。
这是实现这种方法的一种方法:
现在您应该在您的图像(或“组件”)中有一个纯色区域的列表,所以您只需要弄清楚它们是如何相互连接的:
这种方法的优点:
为确保您了解迭代组件及其邻居的工作原理,以下是步骤 5 的示例伪代码实现:
List<Component> allComponents; // created in step 2
Component background; // found in step 3 (this is the component with the 0,0 pixel)
Component figureBorder; // found in step 4
List<Component> pixelGroups = new List<Component>(); // list of pixel groups
for each Component c in allComponents:
if c == background:
continue;
for each Pixel pixel in c.pixelList:
for each Pixel neighbor in pixel.neighbors:
if neighbor.getComponent() == figureBorder:
c.isPixelGroup = true;
int numPixelGroups = 0;
for each Component c in allComponents:
if (c.isPixelGroup)
numPixelGroups++;
关于java - 是否有适当的算法来检测图形的背景颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12995378/