我已经使用openCV处理图像以获得图像图案。图像图案分别由水平线和垂直线的2个 Python 列表表示。线条代表图案的边界。
services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>, ApplicationClaimsIdentityFactory>();
fx = horizontal lines
每个列表是根据距图像左上角的距离顺序排列的。接下来,我使用以下方法计算发现的线的交点:
fy = vertical lines
这应该给我def get_corners(fx,fy):
corners = []
for x_line in fx:
for y_line in fy:
corner = get_intersection(x_line,y_line)
if corner is not None:
corners.append(corner)
(格式为corners
),从左到右,从上到下。现在,我想使用这些坐标将矩形裁剪出图像。
(x,y)
列表的大小各不相同,并且模式也有所不同,这意味着它们有共同点。给定点列表,线corners
和fx
的列表的大小和大小:
如何使用这些点裁剪矩形?
如果需要,可以随时更改fy
。
这里是一个示例:模式检测在2x2中产生4个可能的矩形。这意味着列表get_corners()
中总共有9个值。
points
我可以使用以下方式裁剪第一个矩形:
Points: [[],[],[],
[],[],[],
[],[],[]]
答案 0 :(得分:3)
这里暗中刺伤,但这是您的中间形象吗?我还假设您要区分正方形和矩形,也就是说,您不希望正方形,而只希望矩形。
在这种情况下,我将使用以下步骤:
cnt_rectangles = 0
rectangle_list = []
for index in np.arange(len(points)-1):
p = points[index]
q = points[index+1]
if (p[0] == q[0]) || p[1] == q[1]
#the rectangle vertices must not have the same column or row. reject.
continue
else if abs(p[0] - q[0]) == abs(p[1] - q[1]):
#this is a square. reject
continue
else:
#this is a rectangle
cnt_rectangels+=1
rectangle_list.append((p, q))
答案 1 :(得分:0)
您的问题尚不清楚,但是这里的解决方案假定您的img
变量是一个numpy数组(因为问题用opencv
标记),并且在corners
中具有交点索引。请注意,我修改了get_corners()
函数以按行而不是单个平面数组来构建角,以便于处理,就像您指出的那样。
import numpy as np
def get_corners(fx, fy):
corners = []
for x_line in fx:
row = [] # NOTE: we're building rows here!
for y_line in fy:
corner = get_intersection(x_line, y_line)
if corner is not None:
row.append(corner)
corners.append(row)
def get_crops(img, corners):
crops = []
for i, row in enumerate(corners[0:-1]):
for j in range(len(row) - 1):
x1, y1 = row[j]
next_row = corners[i+1]
x2, y2 = next_row[j+1]
# this slicing works with my test_img,
# but you may need to adjust it for yours
crops.append(img[x1:x2+1, y1:y2+1])
return crops
test_corners = [
[ [0, 0], [0, 1], [0, 2] ],
[ [1, 0], [1, 1], [1, 2] ],
[ [2, 0], [2, 1], [2, 2] ],
]
test_img = np.array(corners) # test img to easily see indices
crops = get_crops(test_img, test_corners)
for i, crop in enumerate(crops):
print("crop [{}]: {}\n".format(i, crop))
这是测试运行的输出。当然,真实的图像还会有其他数据,但这显示了如何对我的test_img
numpy数组进行切片。
crop [0]: [[[0 0] [0 1]]
[[1 0] [1 1]]]
crop [1]: [[[0 1] [0 2]]
[[1 1] [1 2]]]
crop [2]: [[[1 0] [1 1]]
[[2 0] [2 1]]]
crop [3]: [[[1 1] [1 2]]
[[2 1] [2 2]]]