简单的平均值滤波算法作业

平均值滤波原理在c++上的实现。

只是一个cpp萌新的简单的代码作业。

在各位大佬的帮助下,终于写完了,芜湖。——2023.4.7.23:26

在尝试的时候还是充分领悟到new方法的危险。代码中所有数组都是用new方法创建的,然后过程中发生了很多诸如0xc(不知道多少个0)5;堆损坏;访问冲突  之类的问题。查阅了很多书籍,所幸是明白了其中原理,在这里不详细阐述。

在这里没有用普通的rand而是用梅森旋转算法是因为后者在获得随机数方法上更加出色,rand只是伪随机数的实现。

顺便玩了一下gdal,跑了一下看到图像还是很兴奋的。

其中还是有很多不好的代码习惯的,不知道以后再看会不会非常羞耻(笑)

// 滤波.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//生成一个随机数矩阵(可以设置的大一些),随机数的范围是0 - 255.
//程序可以进行滤波操作,其中滤波核大小和值由用户进行设置。
#include
#include
#include

using namespace std;

float** ARRAY(int row, int column, int Cube);
float** Array2(float** Matrix1, int row, int column, int Cube);
float** Filter(int Cube);
void Print(float** Matrix1, int Cube, int row, int column);
int main() {
	int row, column, Cube;
	cout << "ROW COLUMN" << "\n";
	cin >> row >> column;
	cout << "Length of Filter(n=2k-1)" << "\n";
	cin >> Cube;//设定数组行数列数
	float** Matrix1 = ARRAY(row, column, Cube);
	//float** Matrix2 = Array2(Matrix1, row, column, Cube);
	float** Fil = Filter(Cube);
	Print(Matrix1, Cube, row, column);
	system("pause");//暂停
	//下面进行Times次滤波操作	    
	int Times;
	cout << "Filting Times" << "\n";
	cin >> Times;
	float a = 0;
	float b = 0;
	for (int k = 0; k < Times; k++) {
		system("cls");//清屏
		float** Matrix2 = Array2(Matrix1, row, column, Cube);
		for (int n = 0; n < row; n++) {
			for (int m = 0; m < column; m++) {
				float sum = 0;
				for (int i = 0; i < Cube; i++) {
					for (int j = 0; j < Cube; j++) {
						a = Matrix2[n + i][m + j];
						b = Fil[i][j];
						sum += a * b;
					}
				}
				Matrix1[n + (Cube - 1) / 2][m + (Cube - 1) / 2] = sum / (Cube * Cube);//求均值并替换核心值
			}
		}
	Print(Matrix1, Cube, row, column);

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

float** ARRAY(int row, int column, int Cube) {//row为数组行数,column为数组列数,Cube为滤波邻域直径
	random_device rd;//随机数生成器
	mt19937 Random(rd());
	int i = 0, j = 0;
	float** Matrix1;//双指针
	Matrix1 = new float* [row + (Cube - 1)];
	for (int a = 0; a < row + (Cube - 1); a++)
		Matrix1[a] = new float[column + (Cube - 1)];//指针数组的每个元素指向每个int型数组的第一个元素地址,实现了二维数组的创建,在这里往外扩张了(Cube-1)/2圈
	for (i = 0; i < row + Cube - 1; i++)
	{
		for (j = 0; j < column + Cube - 1; j++)
		{
			if (i <= ((Cube - 1) / 2) - 1 || j <= ((Cube - 1) / 2) - 1 || i >= row + ((Cube - 1) / 2) || j >= column + ((Cube - 1) / 2)) {//外界填0元素
				Matrix1[i][j] = 0;
			}
			else { Matrix1[i][j] = (float)(rd() % 255 + 1); }//rand函数填充内界值,rand的范围在[0,255]内
		}
	}
	return Matrix1;
}//创建二维数组,并用随机数初始化每个元素的值,扩展外界且设置元素值为0
float** Array2(float** Matrix1, int row, int column, int Cube) {//创建数组2,作为数组1的备份
	float** Matrix2;
	Matrix2 = new float* [row + (Cube - 1)];
	for (int a = 0; a < row + Cube - 1; a++)
		Matrix2[a] = new float[column + Cube - 1];
	for (int i = 0; i < row + Cube - 1; i++)
	{
		for (int j = 0; j < column + Cube - 1; j++)
		{
			Matrix2[i][j] = Matrix1[i][j];
		}
	}
	return Matrix2;
}
float** Filter(int Cube) {//Fil是一个Cube*Cube大小的滤波器(核)
	float** Fil;
	Fil = new float* [Cube];
	for (int a = 0; a < Cube; a++)
		Fil[a] = new float[Cube];
	for (int i = 0; i < Cube; i++)
	{
		for (int j = 0; j < Cube; j++)
		{
			Fil[i][j] = 1.0;
		}
	}
	return Fil;
}
void Print(float** Matrix1, int Cube, int row, int column) {

	for (int i = (Cube - 1) / 2; i < row + ((Cube - 1) / 2); i++) {//打印处理后的矩阵
		for (int j = (Cube - 1) / 2; j < column + (Cube - 1) / 2; j++) {
			cout << setw(7) << fixed << setprecision(2) << Matrix1[i][j];
		}
		cout << "\n";
	}
	cout << "\n";
}

你可能感兴趣的:(c++)