C++ 计算黑白图像的像素数(OpenCV/C+;+;)

C++ 计算黑白图像的像素数(OpenCV/C+;+;),c++,opencv,C++,Opencv,我是opencv/C++的初学者,希望您能帮助我解决一个看似简单的问题。作为一个例子,我有这样的图像: 。。。并且会忽略背景,背景总是白色的,图像总是黑白的,只剩下云可以计算三件事: 图形的像素数(仅云,不考虑背景) 白色像素的数量。(仅限云计算) 黑色像素的数量。(仅限云计算) 我知道要达到2,用减法第3次 谢谢 这里有一个非常简单的方法 计算黑色像素数(3) 从任何角落开始用黑色填充洪水 计算剩余的白色像素数(2) 将结果(2)和(3)相加得到(1) 您可以使用此代码计数以查找图像中的黑

我是opencv/C++的初学者,希望您能帮助我解决一个看似简单的问题。作为一个例子,我有这样的图像:

。。。并且会忽略背景,背景总是白色的,图像总是黑白的,只剩下云可以计算三件事:

  • 图形的像素数(仅云,不考虑背景)
  • 白色像素的数量。(仅限云计算)
  • 黑色像素的数量。(仅限云计算)
  • 我知道要达到2,用减法第3次


    谢谢

    这里有一个非常简单的方法

    • 计算黑色像素数(3)
    • 从任何角落开始用黑色填充洪水
    • 计算剩余的白色像素数(2)
    • 将结果(2)和(3)相加得到(1)

    您可以使用此代码计数以查找图像中的黑色像素。对白色像素的计数应用相同的逻辑

    #include<opencv2/opencv.hpp>
    #include<opencv2/highgui/highgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
    
    Mat img = imread("/home/jordan/opencv/Test/edge_detection/img2.bmp",0);
    cout<<"cols= "<<img.cols<<"row= "<<img.rows<<"\n";
    int i,j,count=0;
    for(i=0;i<img.cols;i++)
    {
    for(j=0;j<img.rows;j++)
    {
    int k=img.at<uchar>(j,i);
    if(k==0)
    {  
    count++;
    cout<<"col="<<i<<"row="<<j<<"k= "<< k<<"\t\n";
    }
    }
    } 
    cout<<"count="<<count<<"\n";
    }
    
    #包括
    #包括
    使用名称空间std;
    使用名称空间cv;
    int main()
    {
    Mat img=imread(“/home/jordan/opencv/Test/edge_detection/img2.bmp”,0);
    
    cout首先,您可以使用
    cv::countNonZero(img)
    来计算非黑色像素。因此,您可以使用
    (img.rows*img.cols)-cv::countNonZero(img)
    来计算黑色像素

    现在,尝试以下操作:首先,计算黑色像素数。然后尝试使用形态学打开删除CLOLD中的白色斑点。然后,再次计算黑色像素数。现在,可以从第二个计数中减去第一个计数,得到这些斑点中的白色像素数

    然而,这种方法并不准确,因为形态开口也会改变云的外部。另一种方法是在另一个答案中建议的方法,使用泛光填充以黑色填充周围的白色像素

    顺便说一句,形态学开放是这样工作的:

    cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(2 * openingRadius + 1, 2 * openingRadius + 1));
    cv::morphologyEx(mat, mat, cv::MORPH_OPEN, element);
    
    或者,使用cuda:

    cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(2 * openingRadius + 1, 2 * openingRadius + 1));
    cv::cuda::createMorphologyFilter(cv::MORPH_OPEN, CV_8UC1, element)->apply(gpuMat, gpuMat);
    

    我认为使用
    (img.rows*img.cols)-cv::countNonZero(img)