Python 根据像素颜色的变化定位坐标

Python 根据像素颜色的变化定位坐标,python,opencv,image-processing,colors,pixel,Python,Opencv,Image Processing,Colors,Pixel,我试图定位图像中的特定坐标。我有一个图像,只包含两种颜色,粉红色和黑色,如图所示。如果我知道粉色区域中的(x,y)坐标(中心用黄点标记),我如何才能找到粉色区域边界中的坐标(如边界上的黄点所示) 注:黄点不是图像的一部分,我用它来表示感兴趣的区域 我只是想知道除了嵌套for循环之外,是否有其他更快更好的方法来实现这一点,因为我需要在图像的多个区域中找到边界坐标,这可能会真正减慢处理过程 谢谢大家! 首先,找到图像中粉红色区域的轮廓。您可以首先对图像应用Otsu的阈值,然后使用cv2.findO

我试图定位图像中的特定坐标。我有一个图像,只包含两种颜色,粉红色和黑色,如图所示。如果我知道粉色区域中的(x,y)坐标(中心用黄点标记),我如何才能找到粉色区域边界中的坐标(如边界上的黄点所示)

注:黄点不是图像的一部分,我用它来表示感兴趣的区域

我只是想知道除了嵌套for循环之外,是否有其他更快更好的方法来实现这一点,因为我需要在图像的多个区域中找到边界坐标,这可能会真正减慢处理过程


谢谢大家!

首先,找到图像中粉红色区域的轮廓。您可以首先对图像应用Otsu的阈值,然后使用cv2.findOntours()查找轮廓

然后在轮廓边界点中,找到与中心像素具有相同y坐标的点


在这些点中,具有最大x坐标的点将是右侧的点,具有最小x坐标的点将是左侧的点。

这里有一种使用Python/OpenCV和Numpy的方法

  • 读取输入
  • 变灰
  • 大津阈值
  • 裁剪包含中心的行
  • 获取行中所有白色的坐标
  • 打印第一个和最后一个坐标
  • 在输入上画线
  • 保存结果

输入:


输入图像上的行:


欢迎Rahul Kedia thaks回复。我已经在输入图像中完成了语义分割,如上图所示。我真的需要再做一次大津阈值分割吗?如果你已经做了分割,那么我认为你已经有了轮廓。如果是,则不需要设置阈值。这只是为了寻找轮廓。这里显示的图像是分割图像,我只有粉红色的roi和donno关于轮廓的坐标,我们通常从cv2获得。FindContentour我的方法是基于轮廓数据,因此要获得它,你必须像FindContentours()一样进行阈值化函数将以二进制图像作为输入。谢谢分享,这真的很有帮助。这个解决方案非常适合这个图像,但是如果“cy”上有另一个粉红色区域,我能做些什么来避免白线超出黑色区域呢。在这种情况下,它只返回粉红色区域的边界。我只是想粘到黑色之间的粉红色区域,我不确定我是否理解。你能发布一个有问题的图片的链接吗?当然,请看我想贴在图片中用绿点标记的边界上的图片。对于那个图片,我会选择阈值。然后获取轮廓并进行过滤,以仅保留最大轮廓。然后,我会在黑色背景上绘制一个白色填充轮廓,然后执行与上面相同的操作。
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)