opencv直方图灰度均值到255间峰值灰度值求解代码有问题,求助!

#include <opencv2/opencv.hpp>
#include

using namespace cv;
using namespace std;
/***************** 函数声明部分 start ****************/

void cal_mean_stddev(string path); // 计算图像的标准差
/***************** 函数声明部分 end ****************/

int main() {

string path = "1.jpg"; 
Mat src=imread(path);
cal_mean_stddev(path);

// cal_mean_gradient(path);

system("pause"); // 暂停
return 0;

}

// 计算图像的标准差
void cal_mean_stddev(string path) {
Mat src = imread(path);
Mat gray, mat_mean, mat_stddev;
cvtColor(src, gray, CV_RGB2GRAY); // 转换为灰度图
imshow("【灰度图】", gray);
meanStdDev(gray, mat_mean, mat_stddev);
double m, s;
m = mat_mean.at(0, 0);
cout << "cvRound(m) = " << cvRound(m) << endl;
s = mat_stddev.at(0, 0);
cout << "cvRound(s) = " << cvRound(s) << endl;
cout << path << “的灰度均值是:m=” << m << endl;
cout << path << “的标准差是:s=” << s << endl;

//定义函数需要的一些变量
//图片数量nimages
int nimages = 1;
//通道数量,我们总是习惯用数组来表示,后面会讲原因
int channels[1] = { 0};                        
//输出直方图
cv::Mat outputHist;
//维数
int dims = 2;
//存放每个维度直方图尺寸(bin数量)的数组histSize
//int zuo=cvRound(m);
//int you=256;
// int histSize[] = {zuo,you};//!!改动
 int histSize[2] = {cvRound(m),255};//!!改动
//每一维数值的取值范围ranges
float hranges[2] = { cvRound(m),255 };//!!改动
//值范围的指针
const float *ranges[1] = { hranges };
//是否均匀
bool uni = true;
//是否累积
bool accum = false;

//计算图像的直方图
cv::calcHist(&src, nimages, channels, cv::Mat(), outputHist,dims,histSize, ranges, uni, accum);

//遍历每个箱子(bin)检验,这里的是在控制台输出的。
for (int i = cvRound(m); i <256; i++)//!!改动
    std::cout << "bin/value:" << i << "=" << outputHist.at<float>(i) << std::endl;

//画出直方图
int scale = 1;
//直方图的图片
cv::Mat histPic(histSize[0] * scale, histSize[0], CV_8U, cv::Scalar(255));\
//找到最大值和最小值
double maxValue1 = 0;
double minValue1= 0;
cv::Point minLoc1,maxLoc1;
cv::minMaxLoc(outputHist, &minValue1, &maxValue1,&minLoc1,&maxLoc1);
//测试
std::cout << minValue1 << std::endl;
std::cout << maxValue1<< std::endl;
//std::cout << minLoc.y << std::endl;
std::cout << maxLoc1.y << std::endl;//!!改动
//std::cout<<(minLoc.y+maxLoc.y)/2<<std::endl;
//cvRound(minLoc.y+maxLoc.y)/2;
//纵坐标缩放比例
double rate = (histSize[0] / maxValue1)*0.9;
for (int i = 0; i < histSize[0]; i++)
{
    //得到每个i和箱子的值
    float value = outputHist.at<float>(i);
    //画直线
    cv::line(histPic, cv::Point(i*scale, histSize[0]), cv::Point(i*scale, histSize[0] - value*rate), cv::Scalar(0));
}
cv::imshow("histgram", histPic);
cv::waitKey(0); 

}代码标注处!!改动自认为有可能有误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值