opencv c++ 以灰度图方式加载一张图片,并统计该图像素的最大值、最小值、均值以及方差,完整代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv c++ 以灰度图方式加载一张图片,并统计该图像素的最大值、最小值、均值以及方差,完整代码相关的知识,希望对你有一定的参考价值。

参考技术A void main()

IplImage *src = cvLoadImage("xxx",1);

int width = src->width;
int height = src->height;

uchar *ptr = src->imageData;
int Iij;

double Imax = 0, Imin = 255, Iave = 0, Idelta = 0;

for(int i=0;i<height;i++)

for(int j=0;j<width;j++)

Iij = (int) ptr[i*width+j];

if(Iij > Imax)
Imax = Iij;

if(Iij < Imin)
Imin = Iij;

Iave = Iave + Iij;



Iave = Iave/(width*height);

for(int i=0;i<height;i++)

for(int j=0;j<width;j++)

Iij = (int) ptr[i*width+j];

Idelta = Idelta + (Iij-Iave)*(Iij-Iave);



Idelta = Idelta/(width*height);

printf("灰度最大值 = %d\n",Imax);
printf("灰度最小值 = %d\n",Imin);
printf("灰度均值 = %d\n",Iave);
printf("灰度方差 = %d\n",Idelta);

return;
追问

解决了,谢谢你啦!

本回答被提问者采纳
参考技术B 不及到耶!!!!!!!!!!!!!!!!!!!!!!

Qt + OpenCV 灰度错误

【中文标题】Qt + OpenCV 灰度错误【英文标题】:Qt + OpenCV grayscale error 【发布时间】:2012-09-19 12:51:09 【问题描述】:

我一直在尝试为使用 OpenCV 和 C++ 的图像处理任务创建一个简单的界面,并使用 Qt 作为 GUI。 我可以通过 GUI 加载图像,但是当我按下 pushbutton_3 时, 将图像转换为灰度会导致有关 OpenCV 的错误。 我确定我做错了什么。有人可以帮帮我吗?

请看下面的文件:

//mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileDialog>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <vector>

#include <QtCore/QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/types_c.h>
#include <opencv2/imgproc/imgproc.hpp>


namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();




private:
    Ui::MainWindow *ui;
    //Images variables
    cv::Mat image_Idl;
    cv::Mat image_Lit;
    cv::Mat image_Idl_G;
    cv::Mat image_Lit_G;
    double threshHold;

;

#endif // MAINWINDOW_H


//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <QtCore/QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/types_c.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <QSpinBox>
#include <QSlider>
#include <stdio.h>
#include <stdlib.h>
#include <vector>

using namespace std;



MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);

    ui->horizontalSlider->setRange(0,255);
    ui->spinBox->setRange(0,255);

    connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->spinBox,SLOT(setValue(int)));
    connect(ui->spinBox,SIGNAL(valueChanged(int)),ui->horizontalSlider,SLOT(setValue(int)));



MainWindow::~MainWindow()

    delete ui;



void MainWindow::on_pushButton_clicked()

    QString fileName = QFileDialog::getOpenFileName(this,tr("Load Lit Image"),".",tr("Image Files (*.png *.jpg *.jpeg *.bmp)"));
    image_Lit = cv::imread(fileName.toAscii().data());
    cv::namedWindow("Lit Image");
    cv::imshow("Lit Image", image_Lit);


void MainWindow::on_pushButton_2_clicked()

    QString fileName = QFileDialog::getOpenFileName(this,tr("Load Lit Image"),".",tr("Image Files (*.png *.jpg *.jpeg *.bmp)"));
    image_Idl = cv::imread(fileName.toAscii().data());
    cv::namedWindow("Ideal Lit");
    cv::imshow("Ideal Lit", image_Idl);








void MainWindow::on_pushButton_3_clicked()

    //Converstions


    //Convert Lit to gray



        cv::cvtColor(image_Lit, image_Lit_G,CV_RGB2GRAY);

    //Convert Ideal gray


        cv::cvtColor(image_Idl, image_Idl_G,CV_RGB2GRAY);


      //Threshold the Images to a designated value
                // Lit

        threshHold = ui->horizontalSlider->value();

          cv::threshold(image_Lit_G,image_Lit_G, threshHold,255,cv::THRESH_BINARY);
          cv::namedWindow("Gray Scaled Image");
          cv::imshow("Gray Scaled Image", image_Lit_G);



编译器出错:

传递给 C 运行时函数的参数无效。 传递给 C 运行时函数的参数无效。 OpenCV 错误:cvtColor 中的断言失败 (scn == 3 || scn == 4),文件 C:\OpenCV\modules\imgproc\src\color.cpp,第 2834 行 程序意外结束。

弹窗错误:

Microsoft Visual C++

此应用程序按请求以异常方式终止。

【问题讨论】:

你得到什么错误?仅从您的头文件中猜测几乎是不可能的(我认为这与问题没有任何关系)。 您能否更具体一点“给出错误”?您提供的代码也不足以诊断您的问题。 您能否发布将图像从 OpenCV 格式转换为 Qt imge(或您用于在 Qt 中显示图像的任何内容)的代码部分? 抱歉,伙计们,我刚刚注意到我的复制粘贴不成功。我正在编辑和更新缺失的信息。 刚刚更新。不幸的是,系统不允许我发布图片... 【参考方案1】:
#include "iostream"
#include "cv.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int main()

    Mat image = imread("C:\\lena.jpg");
    cvtColor(image,image,CV_RGB2GRAY);
    imshow("test",image);
    waitKey();
    return 0;

上面的代码(Qt 中的控制台应用程序..)正在运行..它显示灰色图像...尝试包含 cv.h 文件...

【讨论】:

是的,上面的代码有效。我用纯 c++ 制作了 inteire 程序并且可以工作。我遇到的问题是添加执行我在纯编码中执行的功能的 GUI。我创建了一个按钮(pushbutton_3)来执行几个功能,例如将图像转换为灰度,阈值查找轮廓等。问题是当我按下按钮时,它在第一个操作中给出错误,在这种情况下是转换图像到灰度。 你用 IplImage 尝试过 C 接口吗? 我不懂C接口。 大家好,除了 C 接口之外,我已经尝试了你所有的建议,但都失败了 :(。不幸的是,我没有更多的权限来发布 GUI 的图像,因为我没有足够的权限这样做是正确的。我已经发布了我制作的所有代码。【参考方案2】:

我在更新我的 windows7 机器后重新编译了上面的程序,令人惊讶的是它的工作原理! 真的很奇怪......我没有对程序进行任何更改(至少我不记得做了任何明显不同的事情)但是在重新安装comodo firewal之后它工作...... 谢谢你们,你们的帮助。

【讨论】:

以上是关于opencv c++ 以灰度图方式加载一张图片,并统计该图像素的最大值、最小值、均值以及方差,完整代码的主要内容,如果未能解决你的问题,请参考以下文章

python使用OpenCV加载图像为灰度图(图像原本为彩色图)并可视化灰度图像(Load image as grayscale and show image)

彩色图到灰度图究竟是怎么变换的

如何用opencv提取一张图片的像素矩阵

计算机视觉之从OpenCV到物体识别

python opencv将图片转为灰度图

如何使用opencv获取已经灰度化二值化的一张黑色图片中的一个亮点的具体像素坐标