OpenCV - расположение всех ненулевых пикселей в двоичном изображении
Как найти местоположения всех ненулевых пикселей в двоичном изображении (cv:: Mat)? Должен ли я сканировать каждый пиксель в изображении или есть функции OpenCV высокого уровня, которые можно использовать? Выход должен быть вектором точек (местоположения пикселей).
Например, это можно сделать в Matlab просто так:
imstats = regionprops(binary_image, 'PixelList');
locations = imstats.PixelList;
или даже проще
[x, y] = find(binary_image);
locations = [x, y];
Изменить. Другими словами, как найти координаты всех ненулевых элементов в cv:: Mat?
Ответы
Ответ 1
Как было предложено @AbidRahmanK, в OpenCV версии 2.4.4 есть функция cv::findNonZero
. Использование:
cv::Mat binaryImage; // input, binary image
cv::Mat locations; // output, locations of non-zero pixels
cv::findNonZero(binaryImage, locations);
Он выполняет эту работу. Эта функция была введена в OpenCV версии 2.4.4 (например, она недоступна в версии 2.4.2). Кроме того, на данный момент findNonZero
по какой-либо причине не содержится в документации.
Ответ 2
Я поместил это как отредактировать в ответ Alex, он не просмотрел, хотя я отправлю его здесь, так как это полезная информация imho.
Вы также можете передавать вектор очков, облегчая им что-то делать с ними:
std::vector<cv::Point2i> locations; // output, locations of non-zero pixels
cv::findNonZero(binaryImage, locations);
Одна нота для функции cv::findNonZero
в общем случае: если binaryImage
содержит нулевые ненулевые элементы, она будет бросать, потому что она пытается выделить память "1 xn", где n является cv::countNonZero
, а n будет очевидно тогда будет 0. Я обойду это, вручную вызвав cv::countNonZero
, но мне не очень нравится это решение.
Ответ 3
Любой, кто хочет сделать это в python. это также возможно сделать с помощью массивов numpy и, следовательно, вам не нужно обновлять версию opencv (или использовать недокументированные функции).
mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
#pixelpoints = cv2.findNonZero(mask)
Комментирование - это те же функции, что и использование openCV. Для получения дополнительной информации см.:
https://github.com/abidrahmank/OpenCV2-Python-Tutorials/blob/master/source/py_tutorials/py_imgproc/py_contours/py_contour_properties/py_contour_properties.rst