使用Python中的OpenCV访问轮廓边界内的像素值 [英] Access pixel values within a contour boundary using OpenCV in Python

查看:3369
本文介绍了使用Python中的OpenCV访问轮廓边界内的像素值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Python 2.7.9上使用OpenCV 3.0.0。我正在尝试跟踪具有静止背景的视频中的对象,并估计其某些属性。由于图像中可能存在多个移动对象,因此我希望能够区分它们并在视频的剩余帧中单独跟踪它们。

I'm using OpenCV 3.0.0 on Python 2.7.9. I'm trying to track an object in a video with a still background, and estimate some of its properties. Since there can be multiple moving objects in an image, I want to be able to differentiate between them and track them individually throughout the remaining frames of the video.

一种方式我以为我可以做到这一点是通过将图像转换为二进制,获取斑点的轮廓(在这种情况下是跟踪对象)并获取对象边界的坐标。然后我可以转到灰度图像中的这些边界坐标,获得由该边界包围的像素强度,并跟踪其他帧中的这种颜色梯度/像素强度。这样,我可以保持两个对象彼此分开,因此它们不会被视为下一帧中的新对象。

One way I thought I could do that was by converting the image to binary, getting the contours of the blobs (tracked object, in this case) and get the coordinates of the object boundary. Then I can go to these boundary coordinates in the grayscale image, get the pixel intensities surrounded by that boundary, and track this color gradient/pixel intensities in the other frames. This way, I could keep two objects separate from each other, so they won't be considered as new objects in the next frame.

我有轮廓边界坐标,但我不知道如何检索该边界内的像素强度。有人可以帮我吗?

I have the contour boundary coordinates, but I don't know how to retrieve the pixel intensities within that boundary. Could someone please help me with that?

谢谢!

推荐答案

继续我们的评论,你可以做的是创建一个 numpy 数组的列表,其中每个元素是描述每个对象轮廓内部的强度。具体来说,对于每个轮廓,创建一个填充轮廓内部的二进制掩码,找到填充对象的(x,y)坐标,然后索引到图像并抓住强度。

Going with our comments, what you can do is create a list of numpy arrays, where each element is the intensities that describe the interior of the contour of each object. Specifically, for each contour, create a binary mask that fills in the interior of the contour, find the (x,y) coordinates of the filled in object, then index into your image and grab the intensities.

我不知道你是如何设置你的代码的,但我们假设你有一个灰度图像叫 IMG 。您可能需要将图像转换为灰度,因为 cv2.findContours 适用于灰度图像。有了这个,通常打电话 cv2.findContours

I don't know exactly how you set up your code, but let's assume you have an image that's grayscale called img. You may need to convert the image to grayscale because cv2.findContours works on grayscale images. With this, call cv2.findContours normally:

import cv2
import numpy as np

#... Put your other code here....
#....

# Call if necessary
#img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Call cv2.findContours
contours,_ = cv2.findContours(img, cv2.RETR_LIST, cv2.cv.CV_CHAIN_APPROX_NONE)

contours 现在是一个列表3D numpy 数组,其中每个大小 N x 1 x 2 其中 N 是每个对象的轮廓点总数。

contours is now a list of 3D numpy arrays where each is of size N x 1 x 2 where N is the total number of contour points for each object.

因此,您可以像这样创建我们的列表:

As such, you can create our list like so:

# Initialize empty list
lst_intensities = []

# For each list of contour points...
for i in range(len(contours)):
    # Create a mask image that contains the contour filled in
    cimg = np.zeros_like(img)
    cv2.drawContours(cimg, contours, i, color=255, thickness=-1)

    # Access the image pixels and create a 1D numpy array then add to list
    pts = np.where(cimg == 255)
    lst_intensities.append(img[pts[0], pts[1]])

对于每个轮廓,我们创建一个空白图像,然后绘制填充轮廓。您可以通过将 thickness 参数指定为-1来填充轮廓占用的区域。我将轮廓的内部设置为255.之后,我们使用 numpy.where 查找数组中符合特定条件的所有行和列位置。在我们的例子中,我们想要找到等于255的值。之后,我们使用这些点来索引我们的图像以获取轮廓内部的像素强度。

For each contour, we create a blank image then draw the filled-in contour in this blank image. You can fill in the area that the contour occupies by specifying the thickness parameter to be -1. I set the interior of the contour to 255. After, we use numpy.where to find all row and column locations in an array that match a certain condition. In our case, we want to find the values that are equal to 255. After, we use these points to index into our image to grab the pixel intensities that are interior to the contour.

lst_intensities 包含1D numpy 数组的列表,其中每个元素为您提供属于内部的强度每个物体的轮廓。要访问每个数组,只需执行 lst_intensities [i] 其中 i 是您要访问的轮廓。

lst_intensities contains that list of 1D numpy arrays where each element gives you the intensities that belong to the interior of the contour of each object. To access each array, simply do lst_intensities[i] where i is the contour you want to access.

这篇关于使用Python中的OpenCV访问轮廓边界内的像素值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆