是否可以检测成对的连接像素?
Is it possible to detect pairs of connected pixels?
我通过 Python 3.7 使用 OpenCV。我有下图(请注意白色区域的一些红色像素):
我知道图像中每个红色像素的 x 和 y 坐标。我想找到所有由单条白线互连的红色像素对。
让我们用 id(蓝色数字)标记每个红色像素:
如您所见,最上面标记为“1”的红色像素只有两个直接连接:一个与标记为“2”的红色像素相连,一个与标记为“3”的红色像素相连。我想要一个元组列表,其中每个元组都是一对相互连接的像素 ID。对于上图,正确的结果是:
[(1,2),
(1,3),
(2,4),
(4,5),
(3,5),
(5,7),
(7,9),
(4,6),
(6,8),
(6,7),
(8,10),
(9,11),
(10,11),
(11,13),
(10,12),
(12,13),
(12,14),
(13,14)]
我还没有编写任何代码,因为我只能使用笨拙的自制算法扫描每个红色像素的 N 个邻居来检测方向。我确信有更有效的解决方案可以利用内置函数。
是否有任何 OpenCV 函数可以帮助完成此任务?
此答案解释了如何使用 np.count_nonzero()
确定两点是否由白线连接。
首先,绘制图像并计算非零像素。此示例图像中有 18896 个非零像素。
import cv2
import numpy as np
import itertools
# Function that converts an image to single channel and counts non-black pixels
def count_non_zero(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
return np.count_nonzero(gray)
# Create source image
img = np.zeros((456,456, 3), np.uint8)
redCoordinates = [(123,123),(345,123),(345,345)]
cv2.line(img, redCoordinates[0], redCoordinates[1], (255,255,255), 65)
for coordinate in redCoordinates: cv2.circle(img, coordinate, 14, (0,0,255), -1)
# Count the non-zero pixels in the image
base = count_non_zero(img)
接下来,遍历红色坐标对的每个组合。在点之间画一条线。检查图像是否具有相同数量的非零像素。
# Iterate through each combination of the redCoordinates
idx = 0
for a,b in list(itertools.combinations(redCoordinates, 2)):
# Draw a line between the two points
test_img = cv2.line(img.copy(), a, b, (234,0,234), 5)
# Recount to see if the images are the same
if count_non_zero(test_img) == base: print(a, b, " are connected.")
else: print(a,b, " are NOT connected.")
这些是一些连接点:
这些是一些没有联系的点:
这是脚本的输出:
(123, 123) (345, 123) are connected.
(123, 123) (345, 345) are NOT connected.
(345, 123) (345, 345) are NOT connected.
我通过 Python 3.7 使用 OpenCV。我有下图(请注意白色区域的一些红色像素):
我知道图像中每个红色像素的 x 和 y 坐标。我想找到所有由单条白线互连的红色像素对。
让我们用 id(蓝色数字)标记每个红色像素:
如您所见,最上面标记为“1”的红色像素只有两个直接连接:一个与标记为“2”的红色像素相连,一个与标记为“3”的红色像素相连。我想要一个元组列表,其中每个元组都是一对相互连接的像素 ID。对于上图,正确的结果是:
[(1,2),
(1,3),
(2,4),
(4,5),
(3,5),
(5,7),
(7,9),
(4,6),
(6,8),
(6,7),
(8,10),
(9,11),
(10,11),
(11,13),
(10,12),
(12,13),
(12,14),
(13,14)]
我还没有编写任何代码,因为我只能使用笨拙的自制算法扫描每个红色像素的 N 个邻居来检测方向。我确信有更有效的解决方案可以利用内置函数。
是否有任何 OpenCV 函数可以帮助完成此任务?
此答案解释了如何使用 np.count_nonzero()
确定两点是否由白线连接。
首先,绘制图像并计算非零像素。此示例图像中有 18896 个非零像素。
import cv2
import numpy as np
import itertools
# Function that converts an image to single channel and counts non-black pixels
def count_non_zero(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
return np.count_nonzero(gray)
# Create source image
img = np.zeros((456,456, 3), np.uint8)
redCoordinates = [(123,123),(345,123),(345,345)]
cv2.line(img, redCoordinates[0], redCoordinates[1], (255,255,255), 65)
for coordinate in redCoordinates: cv2.circle(img, coordinate, 14, (0,0,255), -1)
# Count the non-zero pixels in the image
base = count_non_zero(img)
接下来,遍历红色坐标对的每个组合。在点之间画一条线。检查图像是否具有相同数量的非零像素。
# Iterate through each combination of the redCoordinates
idx = 0
for a,b in list(itertools.combinations(redCoordinates, 2)):
# Draw a line between the two points
test_img = cv2.line(img.copy(), a, b, (234,0,234), 5)
# Recount to see if the images are the same
if count_non_zero(test_img) == base: print(a, b, " are connected.")
else: print(a,b, " are NOT connected.")
这些是一些连接点:
这些是一些没有联系的点:
这是脚本的输出:
(123, 123) (345, 123) are connected.
(123, 123) (345, 345) are NOT connected.
(345, 123) (345, 345) are NOT connected.