使用C++语言,构建一个简易的图像处理系统,实现图像文件读写、图像显示、统计量计算、直方图绘制、图像缩放、图像旋转、滤波等基础的图像处理功能。
时间: 2023-08-22 13:06:44 浏览: 78
c++ 图像处理
好的,下面是一个简易的C++图像处理系统实现方案,可以实现图像文件读写、图像显示、统计量计算、直方图绘制、图像缩放、图像旋转、滤波等基础的图像处理功能。由于篇幅限制,代码中只包含部分功能的实现,您可以根据需要进行扩展和优化。
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void showImage(Mat image, string title = "Image") {
namedWindow(title, WINDOW_NORMAL);
imshow(title, image);
}
void showHistogram(Mat image, string title = "Histogram") {
Mat hist;
int channels[] = { 0 };
int bins = 256;
float range[] = { 0, 256 };
const float* ranges[] = { range };
calcHist(&image, 1, channels, Mat(), hist, 1, &bins, ranges, true, false);
int hist_w = 512, hist_h = 400;
int bin_w = cvRound((double)hist_w / bins);
Mat hist_image(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0));
normalize(hist, hist, 0, hist_image.rows, NORM_MINMAX, -1, Mat());
for (int i = 1; i < bins; i++) {
line(hist_image, Point(bin_w * (i - 1), hist_h - cvRound(hist.at<float>(i - 1))),
Point(bin_w * (i), hist_h - cvRound(hist.at<float>(i))), Scalar(255, 255, 255), 2, 8, 0);
}
showImage(hist_image, title);
}
int main(int argc, char** argv) {
// 读取图像文件
Mat image = imread("lena.jpg", IMREAD_COLOR);
if (image.empty()) {
cout << "无法读取图像文件!" << endl;
return -1;
}
showImage(image);
// 计算图像统计量
Scalar mean_val, stddev_val;
meanStdDev(image, mean_val, stddev_val);
double mean = mean_val[0];
double stddev = stddev_val[0];
cout << "平均值:" << mean << endl;
cout << "方差:" << stddev * stddev << endl;
cout << "标准差:" << stddev << endl;
// 显示图像直方图
showHistogram(image);
// 图像缩放
Mat resized_image;
resize(image, resized_image, Size(), 0.5, 0.5, INTER_LINEAR);
showImage(resized_image, "Resized Image");
// 图像旋转
Point2f center(image.cols / 2.0, image.rows / 2.0);
double angle = 30.0;
Mat rotation_matrix = getRotationMatrix2D(center, angle, 1.0);
Mat rotated_image;
warpAffine(image, rotated_image, rotation_matrix, image.size(), INTER_LINEAR);
showImage(rotated_image, "Rotated Image");
// 滤波
Mat filtered_image;
GaussianBlur(image, filtered_image, Size(5, 5), 0, 0);
showImage(filtered_image, "Filtered Image");
// 等待用户按键
waitKey(0);
return 0;
}
```
在这个示例中,我们首先读取一个彩色图像,并使用showImage函数显示图像。接着,我们使用meanStdDev函数计算图像的统计量,并输出这些统计量的值。然后,我们使用showHistogram函数计算并显示图像的直方图。接下来,我们使用resize函数对图像进行缩放操作,并使用warpAffine函数对图像进行旋转操作。最后,我们使用GaussianBlur函数对图像进行高斯滤波操作,并使用showImage函数显示滤波后的图像。
需要注意的是,showImage和showHistogram函数分别用于显示图像和直方图,可以根据需要进行修改和扩展。
当然,这只是一个简单的示例,您可以根据需要进行更加深入的开发和优化,例如实现更多的图像处理功能。
阅读全文