根据输入的灰度图像,分别计算图像的均值、方差等统计特征,并计算图像的直方图特征并以图形方式显示图像的直方图(用C语言实现)。
时间: 2024-02-12 22:07:29 浏览: 95
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
int main()
{
// 读取灰度图像
cv::Mat img = cv::imread("gray_image.jpg", cv::IMREAD_GRAYSCALE);
// 计算均值和方差
cv::Scalar mean, stddev;
cv::meanStdDev(img, mean, stddev);
printf("Mean: %f\n", mean[0]);
printf("Standard Deviation: %f\n", stddev[0]);
// 计算直方图
int histSize = 256;
float range[] = { 0, 256 };
const float* histRange = { range };
bool uniform = true, accumulate = false;
cv::Mat hist;
cv::calcHist(&img, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange, uniform, accumulate);
// 显示直方图
int histWidth = 512, histHeight = 400;
int binWidth = cvRound((double)histWidth / histSize);
cv::Mat histImage(histHeight, histWidth, CV_8UC1, cv::Scalar(0));
cv::normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());
for (int i = 1; i < histSize; i++)
{
cv::line(histImage, cv::Point(binWidth * (i - 1), histHeight - cvRound(hist.at<float>(i - 1))),
cv::Point(binWidth * (i), histHeight - cvRound(hist.at<float>(i))),
cv::Scalar(255), 2, cv::LINE_AA);
}
cv::imshow("Histogram", histImage);
cv::waitKey(0);
return 0;
}
```
注:这里的"gray_image.jpg"需要替换成你的灰度图像文件的名称。
阅读全文