Python 检测4个有趣的像素

Python 检测4个有趣的像素,python,image,python-2.7,opencv,pixels,Python,Image,Python 2.7,Opencv,Pixels,我使用OpenCV阅读了这张图片: 我检测其中对象的边界并显示图片: 这是我的密码: import cv2 import numpy as np from matplotlib import pyplot as plt im=cv2.imread('db/4.jpg') #mask=np.zeros(img.shape[:2],np.uint8) imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) ret,thresh=cv2.threshold(img

我使用OpenCV阅读了这张图片:

我检测其中对象的边界并显示图片:

这是我的密码:

import cv2
import numpy as np
from matplotlib import pyplot as plt


im=cv2.imread('db/4.jpg')
#mask=np.zeros(img.shape[:2],np.uint8)
imgray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh=cv2.threshold(imgray,242,245,235)
contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

cv2.drawContours(im,contours,-1,(0,255,0),3)
cv2.imshow("GL",im)
cv2.waitKey(0)
cv2.destroyAllWindows()
我想做的是:

我想得到属于其中一个轮廓的4个像素的坐标,并且:

  • 第一个是X轴上的壁橱
  • 第二个距离X轴最远
  • 第三个是Y轴的壁橱
  • 第四个是距离Y轴最远的

请注意,我的代码中可变轮廓的数量可能会因我阅读的图片而异。

您可以将所有轮廓堆叠到一个数组中
绿色
并搜索最小/最大x/y值:

green = np.vstack(contours).reshape((-1, 2))
print "Min X:", green[np.where(green[:, 0] == green[:, 0].min()), :]
print "Man X:", green[np.where(green[:, 0] == green[:, 0].max()), :]
print "Min Y:", green[np.where(green[:, 1] == green[:, 1].min()), :]
print "Man Y:", green[np.where(green[:, 1] == green[:, 1].max()), :]
请注意,特别是对于矩形,有多个像素符合您的要求,因为它们与x或y轴的距离相等

以下是“四”像素的可视化:

生成PyLab代码:

pl.imshow(im)
pl.gca().autoscale(False)
minX = np.where(green[:, 0] == green[:, 0].min())
maxX = np.where(green[:, 0] == green[:, 0].max())
minY = np.where(green[:, 1] == green[:, 1].min())
maxY = np.where(green[:, 1] == green[:, 1].max())
pl.plot(green[minX, 0], green[minX, 1], 'ro')
pl.plot(green[maxX, 0], green[maxX, 1], 'go')
pl.plot(green[minY, 0], green[minY, 1], 'bo')
pl.plot(green[maxY, 0], green[maxY, 1], 'yo')

类似于?@bicker No.您在我的程序中看到变量
轮廓了吗?所有绿色像素(对象的轮廓)都保存为数组列表。我想在数组列表中查找我提到的4个像素。那么你想把所有轮廓的边界框组合在一起吗?就像一个全局最小X,全局最大X?图片只是一个例子,它与几何形状无关。我只想得到这4个像素(最底部、顶部、左侧和右侧)@烧杯匠把它烤了。我没有参考任何几何形状,重复说你想要4个点,而不添加任何澄清信息,这对我们没有任何帮助。你的解决方案非常有效。非常感谢你。最后一个问题:如果我只想得到最大Y的一个像素,因为正如你所说,矩形的线条有很多像素可以满足需要,那该怎么办?你回答了我的问题,我知道我没有权利问这个问题,但这听起来对你来说太容易了。@Kabyle:别担心。您可以在
where
命令之后添加
[0][0]
,以仅获取第一个索引。因此,始终仅使用一个轮廓点。