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版本是什么样的? 谢谢!
答案 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]]]