cv :: MatIterator等效于numpy

时间:2013-08-20 08:20:16

标签: python opencv numpy

numpy中RGB图像的cv :: MatIterator相当于什么? 我读到了numpy.nditer,但我无法正确地使用它来制定我的要求。

例如,考虑下面的C ++代码,使用OpenCV迭代每个像素并分配RGB值:

cv::Mat rgbImage(someheight, somewidth, CV_8UC3);
cv::MatIterator_<cv::Vec3b> first = rgbImage.begin<cv::Vec3b>()
cv::MatIterator_<cv::Vec3b> last = rgbImage.end<cv::Vec3b>()

while (first!=last){
    *first = (get <cv::Vec3b> value from somewhere)
    ++first;
}

在上面的代码中,MatIterator first用于直接在图像中的每个像素上分配cv :: Vec3b类型的(R,G,B)值。

考虑下面的Python代码,

rgbImage = np.zeros((someheight, somewidth, 3), dtype = np.uint8)
first= np.nditer(rgbImage)
while not first.finished():
     ???

有人可以提供一个例子,说明直接分配(R,G,B)元组值的等效numpy版本是什么样的? 谢谢!

1 个答案:

答案 0 :(得分:0)

迭代数组的一种简单方法是使用np.ndenumerate和一个for循环,然后你可以修改它里面的图像,下面是一个如何使用它的例子:

import numpy as np

# generate a random numpy array as loaded from cv2.imread()
img = np.random.randint(255, size=(8, 10, 3))

for (x,y,z), value in np.ndenumerate(img):
    do_something(img[x,y,z]) # modify to do whatever you want

请记住,OpenCV使用BGR而不是RGB。因此,如果您想在尺寸为3x4的黑色图像中将洋红色(BGR =(255,0,255))指定给像素(x = 1,y = 2),您将执行以下操作:

>>> import numpy as np

>>> img = np.zeros((3, 4, 3), dtype = np.uint8)

>>> for (x,y), value in np.ndenumerate(img[:,:,0]):
>>>     if x == 1 and y == 2:
>>>         img[x,y,:] = (255,0,255)    
>>> print img
[[[  0   0   0]
  [  0   0   0]
  [  0   0   0]
  [  0   0   0]]

 [[  0   0   0]
  [  0   0   0]
  [255   0 255]
  [  0   0   0]]

 [[  0   0   0]
  [  0   0   0]
  [  0   0   0]
  [  0   0   0]]]