以下是我今天遇到的视觉问题。这里的问题只是图片中有多少个正方形。
你怎么会通过代码来解决这样的事情?此外,如果未处理实际图片,您将如何进行建模呢?
P.S:我觉得实际的分辨率需要一个规则来定义什么可以被视为一个正方形。可以说,两边的长度相等,并且可以由任意数量的段组成,只要它们适合于封闭的正方形。我不确定你怎么能代表一个职位。
答案 0 :(得分:1)
编码:你拥有的是一个网络。将其编码为连接位于离散二维空间中的节点的网络。
问题实际上是要求您计算满足以下属性的路径数量:
在这种情况下转向是(a)如果先前的移动导致y坐标的变化,则此移动导致x坐标的变化;或者(b)如果先前的移动导致x坐标发生变化,则此移动会导致y坐标发生变化。
关于跟踪过程:我在这个页面上看到的最好的建议只是迭代每个节点,并为每个这样的节点检查所有可能的方形大小。这应该避免需要进一步跟踪。
如果你有一个更聪明的方法,只要你的路径总是左手或总是右手,每个方块由起始顶点和边长度唯一标识。
答案 1 :(得分:1)
如果您可以将其建模为矩阵,那么您需要的唯一信息是顶点的位置。然后,对于每个顶点,检查同一行中的所有顶点以及每个找到的顶点检查它们的列。然后删除已处理的顶点。按列进行相同操作。最糟糕的情况是n! (?)
我添加了代码以便澄清。
public class SqFinder {
int calculateSquares(int[][] vertices, int n) {
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (vertices[i][j] == 1) {
for (int k = 1; k < n-j; k++) {
if (i + k < n && vertices[i][j+k] == 1 && vertices[i + k][j] == 1 && vertices[i + k][j + k] == 1)
count++;
}
}
vertices[i][j] =0;
}
}
return count;
}
public static void main(String[] args) {
SqFinder a = new SqFinder();
// int [][] test = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
int [][] test = {{1,1,1},{1,1,1},{1,1,1}};
System.out.println(a.calculateSquares(test, 3));
}
}
答案 2 :(得分:1)
最简单的方法是循环遍历每个顶点,并检查它是否可以是宽度为1的正方形的左上顶点,然后是宽度为2的3,等等。
答案 3 :(得分:0)
这样的事情应该这样做:
int line_width = 1; //the width of the square line
int squares = 0;
for (int x = 0; x < width; ++x)
{
for (int y = 0; y < height; ++y)
{
for (int size = line_width; x + size < width && y + size < height; ++x)
{
if (valid_square_at(x, y, x + size, y + size, line_width))
{
++squares;
}
}
}
}
return squares;
bool valid_square_at(x_0, y_0, x_1, y_1, width)
{
return valid_line(x_0, y_0, x_0_ x_1, width)
&& valid_line(x_0, y_0, x_1_ x_0, width)
&& valid_line(x_0, y_1, x_1_ x_1, width)
&& valid_line(x_1, y_0, x_1_ x_1, width);
}
bool valid_line(x_0, y_0, x_1, y_1, width)
{
//check that all pixel in that line are black...
}
基本上对于图片中的每个点,如果该像素的正方形开始,则检查每个可能的正方形尺寸。这很简单,因为你的方块都与边界“对齐”......问题是如果它们不是......