【发布时间】:2015-02-16 21:08:26
【问题描述】:
我是 opencv / C ++ 的初学者,希望您能帮助解决一个看似简单的问题。例如,我有这张图片:
...并且会忽略背景,它永远是白色的,图像永远是黑白的,只剩下云可以计算三件事:
- 图形的像素数(仅云,不考虑背景)。
- 白色像素的数量。 (仅限云)
- 黑色像素的数量。 (仅限云)
我知道要达到 2,用它减去 3。
谢谢!
【问题讨论】:
我是 opencv / C ++ 的初学者,希望您能帮助解决一个看似简单的问题。例如,我有这张图片:
...并且会忽略背景,它永远是白色的,图像永远是黑白的,只剩下云可以计算三件事:
我知道要达到 2,用它减去 3。
谢谢!
【问题讨论】:
这是一个非常简单的方法
【讨论】:
首先,您可以使用cv::countNonZero(img) 来计算非黑色像素。因此您可以使用(img.rows * img.cols) - cv::countNonZero(img) 来计算黑色像素。
现在,尝试以下操作:首先,计算黑色像素。然后尝试使用形态开口去除云内的那些白色斑点。之后,再次计算黑色像素。现在,您可以从第二个计数中减去第一个计数,您将获得这些斑点内的白色像素数量。
但是,这种方法并不准确,因为形态开口也会稍微改变外部的云。另一种方法是使用其他答案中建议的方法,使用泛光填充将周围的白色像素填充为黑色。
顺便说一句,形态开场是这样的:
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);
【讨论】:
您可以使用此代码来计算图像中的黑色像素。应用相同的逻辑来计算白色像素。
#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";
}
【讨论】:
(img.rows * img.cols) - cv::countNonZero(img)计算黑色像素更容易