數據結構第一次作業

題目:

設計一函數,該函數對K個M*N的灰度圖像(矩陣)處理。功能是取每個圖像的第x行(或列),生成一個新的圖像。要求使用指針實現上述程序。

data

白蟻的CT掃描圖像(RAW)

代碼


#include <fstream>
#include <iostream>
using namespace std;

int main()
{

	unsigned short *CTdata;//定義爲指針
	unsigned short *CTdata1;
	int  Width = 512;
	int  Height = 512;
	int Numslice = 512;
	int Length = Width * Height*Numslice;
	int Length1 = Width*Numslice;//一幅合成圖像
	CTdata = new unsigned short[Length];//連續開闢一段空間
	CTdata1 = new unsigned short[Length1];

	// 以讀模式打開文件
	ifstream infile;
	infile.open("C:\\yanglei\\shuju\\白蟻-CNU008269-head 512x512x512-ushort.raw", ios::binary);
	if (!infile.is_open())
	{
		std::cout << "False" << endl;
	}
	std::cout << "Reading from the file" << endl;
	infile.read((char*)CTdata, Length * sizeof(unsigned short));
	//cout << CTdata << endl;
	// 關閉打開的文件
	infile.close();


	/*	  for (int i=0; i<Length;i++)
	  {
	   CTdata[i] = i%10;
	  }
   */

	//程序主體
	//如果固定取第choose1列(0<choose1<Length);
	//若輸入choose1<0,意味着取行;
	std::cout << "請輸入所要選擇的列數" << endl;
	int choosel;
	cin >> choosel;
	if (choosel >= 0)
	{
		for (int i = 0; i < Length; i++)
		{
			if (i%Width == choosel)
			{
				int a = i / Width;
				*(CTdata1 + a) = *(CTdata + i);
			}
		}
	}
	else
	{
		int b=abs(choosel);
		int b1=(b-1)*Height;//首元素位置
		for (int j = 0; j < Height; j++)
		{
			for (int p = 0; p < Width; p++)
			{
				*(CTdata1 + p + Width * j) = *(CTdata + b1 + Length1 * j + p);
			}
		}
	}

   // 以寫模式打開文件
	ofstream outfile;


	std::cout << "Writing to the file" << endl;
	//   cout << "Enter your name: "; 
	//   cin.getline(data, 100);

	outfile.open("C:\\yanglei\\shuju\\白蟻-CNU008269-head 512x512x512-ushort222.raw", ios::binary);
	// 向文件寫入用戶輸入的數據
	//outfile.flush();
	outfile.write((char*)CTdata1, Length1 * sizeof(unsigned short));

	// 關閉打開的文件
	outfile.close();

	delete[] CTdata;
	delete[] CTdata1;
	return 0;
}


代碼結果

取行結果:

在這裏插入圖片描述

取列結果:

在這裏插入圖片描述

思路

代碼中數組爲1維數組,只要選出我們感興趣的點即可。
4444*4*4圖像爲例。我們爲每一個像素給定一個一維座標值來確定他們的位置。
在這裏插入圖片描述
同一列的數有什麼聯繫?
每一層均取第一列,那麼座標值/4應餘0;去第二列,座標值/4應餘1,…,以此類推512的情況。
那我們怎麼知道,取得固定列是第幾層呢?這時候就要用到座標值/4的值。同一值列是同一層取得,值的大小決定了在新圖像中,這一列應該放在怎樣的位置。
同一行的數有什麼聯繫?
首先確定取第i行,那麼第一層中i行的第一個座標值是已知的。往後數4個都賦值給新數組中的第1行;以此類推,我們可以求出第二層中i行第一個座標值,往後數4個都賦值給新數組中的第2行,…,這樣,我們就知道了不同層中同一行數之間的聯繫,很清楚地,應該使用循環嵌套。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章