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