当前位置: 首页 > 知识库问答 >
问题:

OpenCV -二进制图像中所有非零像素的位置

胥诚
2023-03-14

如何找到二进制图像(cv::Mat)中所有非零像素的位置?我是否必须扫描图像中的每个像素,或者是否可以使用高级OpenCV函数?输出应为点(像素位置)的矢量。

例如,这可以在Matlab中简单地完成:

imstats = regionprops(binary_image, 'PixelList');
locations = imstats.PixelList;

或者更简单

[x, y] = find(binary_image);
locations = [x, y];

编辑:换句话说,如何找到坐标的所有非零元素在cv::垫?

共有3个答案

柏阳炎
2023-03-14

任何想用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

夏侯昊明
2023-03-14

正如@AbidRahmanK所建议的,在OpenCV版本2.4.4中有一个函数<;code>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中不可用)。此外,由于某些原因,到目前为止,findNonZero不在文档中。

郗浩
2023-03-14

我把它作为编辑放在亚历克斯的回答中,它没有得到审查,所以我将在这里发布,因为它是有用的信息。

您还可以传递点向量,以便之后更轻松地使用它们做某事:

std::vector<cv::Point2i> locations;   // output, locations of non-zero pixels 
cv::findNonZero(binaryImage, locations);

对于< code>cv::findNonZero函数,有一点需要注意:如果< code>binaryImage包含零个非零元素,它将抛出,因为它试图分配“1 x n”个内存,其中n是< code>cv::countNonZero,那么n显然是0。我通过预先手动调用< code>cv::countNonZero来规避这个问题,但是我并不太喜欢这个解决方案。

 类似资料:
  • 主要内容:示例使用方法将灰度图像转换为二进制值图像。以下是此方法的语法。 该方法接受以下参数 - mat - 表示输入图像的对象。 dst - 表示输出图像的对象。 thresh - 表示阈值的整数。 maxval - 一个整数,表示与和阈值类型一起使用的最大值。 type - 表示转换类型的整数代码,例如RGB到灰度。 通过将代码与值一起传递给其余参数,可以将灰度图像转换为二值图像。 示例 以下程序演示如何将

  • 我试图在一个形状为(n,10)的数组中创建所有可能的0和1的组合。例如,如果我们假设一个像这样的任意组合:np.array([0,0,1,1,0,0,1,1,0,0]),我如何生成所有可能的组合(这将产生2^10=1024数组)?

  • 因此,我尝试获取图像的轮廓,但它似乎是错误的数据类型,我得到以下错误: cv2。错误:OpenCV(4.2.0)/Users/travis/build/skvark/OpenCV-python/OpenCV/modules/imgproc/src/contours。cpp:197:错误:(-210:不支持的格式或格式组合)[Start]FindContours在模式下仅支持CV_8UC1图像!=C

  • 我只想弄清楚我的概念-访问CV::MAT的所有矩阵元素是否意味着我实际上访问了图像的所有像素值(灰度-1通道,颜色-3通道)?假设我的代码打印灰度矩阵的值(加载1通道图像,类型为CV_32FC1),如下所示,那么这意味着我只访问cv::mat的成员,还是我也访问图像的像素值(具有1通道灰度,类型为CV_32FC1)? 我对使用OpenCV进行图像处理还是一个新手,我想澄清一下我的想法。如果我错了,

  • 这是logcat 08-12 08:52:32.887:D/DalvikVM(774):GC_CONCURRENT释放71K,7%释放2765K/2964K,暂停23ms+15ms,总计94ms 08-12 08:52:33.497:D/gralloc_goldfish(774):检测到没有GPU仿真的仿真器。 08-12 08:52:40.698:D/DalvikVM(774):GC_CONCU

  • 本文向大家介绍Python OpenCV处理图像之图像像素点操作,包括了Python OpenCV处理图像之图像像素点操作的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python OpenCV图像像素点操作的具体代码,供大家参考,具体内容如下 0x01. 像素 有两种直接操作图片像素点的方法: 第一种办法就是将一张图片看成一个多维的list,例如对于一张图片im,想要操作第四行第