如果你想将计算得到的平均像素图变得粗糙,你可以使用OpenCV中的图像缩放函数resize
来实现。下面是修改后的代码:
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
cv::Mat calculateAverageImage(const std::vector<cv::Mat>& images) {
if (images.empty()) {
std::cerr << "Error: Image vector is empty." << std::endl;
return cv::Mat();
}
// 获取第一张图像的尺寸信息
int rows = images[0].rows;
int cols = images[0].cols;
// 创建一个与输入图像相同大小和类型的累加器矩阵
cv::Mat accumulator(rows, cols, CV_32FC1, cv::Scalar(0.0));
// 对每张输入图像进行累加
for (const auto& image : images) {
if (image.rows != rows || image.cols != cols || image.type() != CV_8UC1) {
std::cerr << "Error: Image sizes or types are not consistent." << std::endl;
return cv::Mat();
}
cv::Mat convertedImg;
image.convertTo(convertedImg, CV_32FC1); // 转换为浮点型
accumulator += convertedImg; // 累加到accumulator中
}
// 计算平均值并转换回8位无符号整型图像
accumulator /= images.size();
cv::Mat averageImage;
accumulator.convertTo(averageImage, CV_8UC1);
return averageImage;
}
cv::Mat makeImageRough(const cv::Mat& image, int scaleFactor) {
cv::Mat roughImage;
cv::resize(image, roughImage, cv::Size(), scaleFactor, scaleFactor, cv::INTER_NEAREST);
return roughImage;
}
int main() {
// 假设有三张8位单通道灰度图像,命名为img1、img2、img3,并已经加载到cv::Mat对象中
// 将这些图像存储在一个向量中
std::vector<cv::Mat> images = {img1, img2, img3};
// 计算平均像素图
cv::Mat averageImage = calculateAverageImage(images);
// 将平均像素图变得粗糙
int scaleFactor = 4; // 缩放因子,值越大越粗糙
cv::Mat roughAverageImage = makeImageRough(averageImage, scaleFactor);
// 显示粗糙的平均像素图
cv::imshow("Rough Average Image", roughAverageImage);
cv::waitKey(0);
return 0;
}
在这个修改后的代码中,我添加了一个名为makeImageRough
的函数,它接受一个输入图像和一个缩放因子,并使用最近邻插值方法对图像进行缩小操作。然后,在主函数中调用makeImageRough
函数来生成粗糙版本的平均像素图。
你可以通过调整scaleFactor
的值来控制图像的粗糙程度。较大的缩放因子将导致更明显的像素块效果,使图像看起来更加粗糙。
内容由零声教学AI助手提供,问题来源于学员提问