根据像素颜色的变化定位坐标
Locate the coordinate based on change in pixel color
我正在尝试定位图像中的特定坐标。我有一个图像,其中仅包含 2 种颜色,如图像中所示的粉红色和黑色。
注意:黄点不是图像的一部分,我用它来表示感兴趣的区域。
我只想知道除了嵌套 for 循环之外是否有任何更快更好的方法来执行此操作,这可能会真正减慢过程,因为我必须在图像的多个区域中找到边界坐标。
谢谢!
首先,找到图像中粉红色区域的轮廓。您可以通过首先在图像上应用 Otsu 的阈值处理然后使用 cv2.findContours().
找到轮廓来做到这一点
然后在轮廓边界点中,找到与中心像素y坐标相同的点。
在这些点中,x坐标最大的点在右边,x坐标最小的点在左边。
这是使用 Python/OpenCV 和 Numpy 的一种方法。
- 读取输入
- 转换为灰色
- 大津门槛
- 裁剪包含中心的行
- 获取行中所有为白色的坐标
- 打印第一个和最后一个坐标
- 在输入上画线
- 保存结果
输入:
import cv2
import numpy as np
# load image
img = cv2.imread("pink_blob.png")
hh, ww = img.shape[:2]
# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# threshold
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
# center coords
center = (115,82)
cy = center[1]
# crop row at y center
row = thresh[cy:cy+1, 0:ww]
# get coordinates along row where it is white
# swap x and y between numpy and opencv coords
coords = np.argwhere(row==255)
num_coords = len(coords)
start = coords[0]
end = coords[num_coords-1]
start_pt = (start[1],cy)
end_pt = (end[1],cy)
print(start_pt)
print(end_pt)
# draw line from start to end coordinates on input
result = img.copy()
cv2.line(result, start_pt, end_pt, (255,255,255), 1)
# save result
cv2.imwrite('pink_blob_line.png', result)
# show result
cv2.imshow('result', result)
cv2.waitKey(0)
Start and End Coordinates:
(67, 82)
(160, 82)
输入图像上的线条:
我正在尝试定位图像中的特定坐标。我有一个图像,其中仅包含 2 种颜色,如图像中所示的粉红色和黑色。
注意:黄点不是图像的一部分,我用它来表示感兴趣的区域。
我只想知道除了嵌套 for 循环之外是否有任何更快更好的方法来执行此操作,这可能会真正减慢过程,因为我必须在图像的多个区域中找到边界坐标。
谢谢!
首先,找到图像中粉红色区域的轮廓。您可以通过首先在图像上应用 Otsu 的阈值处理然后使用 cv2.findContours().
找到轮廓来做到这一点然后在轮廓边界点中,找到与中心像素y坐标相同的点。
在这些点中,x坐标最大的点在右边,x坐标最小的点在左边。
这是使用 Python/OpenCV 和 Numpy 的一种方法。
- 读取输入
- 转换为灰色
- 大津门槛
- 裁剪包含中心的行
- 获取行中所有为白色的坐标
- 打印第一个和最后一个坐标
- 在输入上画线
- 保存结果
输入:
import cv2
import numpy as np
# load image
img = cv2.imread("pink_blob.png")
hh, ww = img.shape[:2]
# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# threshold
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
# center coords
center = (115,82)
cy = center[1]
# crop row at y center
row = thresh[cy:cy+1, 0:ww]
# get coordinates along row where it is white
# swap x and y between numpy and opencv coords
coords = np.argwhere(row==255)
num_coords = len(coords)
start = coords[0]
end = coords[num_coords-1]
start_pt = (start[1],cy)
end_pt = (end[1],cy)
print(start_pt)
print(end_pt)
# draw line from start to end coordinates on input
result = img.copy()
cv2.line(result, start_pt, end_pt, (255,255,255), 1)
# save result
cv2.imwrite('pink_blob_line.png', result)
# show result
cv2.imshow('result', result)
cv2.waitKey(0)
Start and End Coordinates:
(67, 82)
(160, 82)
输入图像上的线条: