c++ - 使用Opencv获取多张图片的std偏差

标签 c++ opencv image-processing

我正在尝试使用 OpenCV 获取多张图片的标准偏差,这是我所做的:

#include #包括 #包括

 using namespace std;
  using namespace cv;

 int main(){
cv::Mat frame,frame32f;
char filename[40];
cv::Mat mean;
const int count =134;
const int width  = 1920;
const int height = 1080;
cv::Mat resultframe = cv::Mat::zeros(height,width,CV_32FC3);
cv::Mat deviationframe = cv::Mat ::zeros(height,width,CV_32FC3);
cv::Mat temp = cv::Mat ::zeros(height,width,CV_32FC3);
for(int i = 1 ; i<= count; i++){
//int i = 3;
sprintf(filename,"d:\\BMdvideos\\images\\image%d.tiff",i);
frame = imread(filename,CV_LOAD_IMAGE_COLOR);
frame.convertTo(frame32f,CV_32FC3 );
resultframe +=frame32f;
frame.release();
}
resultframe *= (1.0/count);
for(int j =1; j<count; j++){
    sprintf(filename,"d:\\BMdvideos\\images\\image%d.tiff",j);
    frame = imread(filename,CV_LOAD_IMAGE_COLOR);
    frame.convertTo(frame32f,CV_32FC3);
    temp =(frame32f - resultframe);
    deviationframe+= temp.mul(temp);

    //temp.release();
}
imshow("devi",deviationframe);  // works
deviationframe *= 1.0/(count -1);
imshow("devi2",deviationframe); // works
cv::sqrt(deviationframe,deviationframe);
resultframe *= 1.0/255.0;
imshow("devi3",deviationframe);// works
deviationframe *= 1.0/255.0;

imshow("mean ",resultframe);
imshow("deviation frame ",deviationframe);// BLACK FRAME !!!!!!!!!!!!!!!!!!!
    waitKey(0);
return 0;

当我看到我得到的结果时,“平均值”是正确的,但标准偏差是错误的。知道我做错了什么,在此先感谢您的帮助

最佳答案

您没有累积差异平方图像的结果来计算标准偏差。您当前代码的结果是只有最后一张图像被平方并除以图像总数。之前的所有计算均无效。

此外,除以255只是为了图像的可视化,而不是为了实际计算。在计算标准偏差之前您除以 255,这会使您的结果不正确。

修改你的代码如下:

.
.
.
resultframe *= (1.0/count);
cv::Mat deviationResult = cv::Mat::zeros(height,width,CV_32FC3);

for(int j =1; j< count; j++)
{
    sprintf(filename,"d:\\BMdvideos\\images\\image%d.tiff",j);
    frame = imread(filename,CV_LOAD_IMAGE_COLOR);
    frame.convertTo(frame32f,CV_32FC3);
    deviationframe =(frame32f - resultframe);
    deviationResult += deviationframe.mul(deviationframe);
}
resultframe *= (1.0/255.0);
deviationResult = deviationResult /(count -1 );
cv::sqrt(deviationResult ,deviationResult );
deviationResult *= (1.0/255.0);
imshow("mean ",resultframe);
imshow("deviation frame ",deviationResult);
waitKey(0);
return 0;

关于c++ - 使用Opencv获取多张图片的std偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14873304/

相关文章:

c++ - 在 OpenCV 中将两张纸片合并成一张图像

c++ - 灰度图像创建 16 位

c++ - 推荐哪个C/C++的跨平台UI框架...

c++ - omp_get_thread_num() 返回有问题的数字?

xcode - 在 Xcode 中链接 OpenCV 静态库

macos - 让 OpenCV 在 OSX Mavericks 上使用 Processing 2.1.1

c++ - 指针输出的虚拟值

c++ - 是否有任何好的算法实现来检测相似图像?

c++ - 这段代码可能会陷入无限循环吗?

c++ - 如何使用 QtConcurrent::run 重载函数