我正在尝试将pgm文件[只是一个像素矩阵,设置行和设置列]放入一个数组中,水平翻转并再次输出。 这就是我在阅读它的方式:
bool PgmPicture::readPgmFile(string inputFile)
{
stringstream ss;
string line = "";
int magicNumber;
ifstream pgmIn;
pgmIn.open(inputFile.c_str());
if (pgmIn.fail()) { //makes sure that itemList opened okay.
perror(inputFile.c_str());
return false;
}
getline(pgmIn,line);
pgmIn >> numRows >> numCols >> magicNumber;
for(int row = 0; row < numRows ; row++) {
for (int col = 0; col < numCols ; col++) {
pgmIn >> picture[row][col]; //this array only contains pixel values, no headers or flags.
}
}
return true;
}
所以基本上,图片的第二行包含2个值:行和列。例如,300和500表示图片为300行和500列。如您所见,上面的函数将该行读入numRows和numCols。
在后面的函数中,我试图通过交换像素对来水平翻转图片(例如,最右边的像素与第一个像素,最右边的一个减去一个与第一个+ 1等等)中间。)
这是我的功能:
void PgmPicture::hflip(){
int tmp;
for(int row = 0; row < numRows ; row++) {
for (int col = 0; col < numCols ; col++) {
tmp = picture[row][col];
picture[row][col] = picture[numRows - 1 - row][col];
picture[numRows -1 - row][col] = tmp;
}
}
}
这有什么问题?它只输出与原始图片完全相同的图片。它应该逐行进行并按照我的描述切换每个元素。你们可以用新鲜的眼睛看看这个吗?我已经跟踪了一段时间,我无法弄明白。
修改 我将代码更改为:
int tmp;
for(int row = 0; row < numRows ; row++) {
for (int col = 0; col < numCols/2 ; col++) {
tmp = picture[row][col];
picture[row][col] = picture[row][numCols - 1 - col];
picture[row][numCols - 1 - col] = tmp;
}
}
我只是弄得一团糟。这是原始的: http://i493.photobucket.com/albums/rr294/Jamlegend/mammoth_zps31b72d88.png 这是后照片: http://i493.photobucket.com/albums/rr294/Jamlegend/after_zpsdf1a8b40.png
答案 0 :(得分:0)
从代码行:
tmp = picture[row][col];
picture[row][col] = picture[numRows - 1 - row][col];
picture[numRows -1 - row][col] = tmp;
我会说:你用顶部像素交换顶部像素,顶部1用底部1交换,依此类推。你说你想要用正确的像素交换左边。你的行应该是这样的:
tmp = picture[row][col];
picture[row][col] = picture[row][numCols - 1 - col];
picture[row][numCols - 1 - col] = tmp;
试试这个,它可以解决你的问题。也许你没有看到它,因为你的图像有相同的顶部和底部?在拥有图像处理代码时,最好包含图像(结果和输入)。
答案 1 :(得分:0)
此:
picture[row][col] = picture[numRows - 1 - row][col];
picture[numRows -1 - row][col] = tmp;
应该是这样的:
picture[row][col] = picture[row][numCols - 1 - col];
picture[row][numCols - 1 - col] = tmp;
你需要循环一半的列,否则你会再次切换回来。
for (int col = 0; col < numCols / 2; col++)
答案 2 :(得分:0)
您只需要迭代一半的数组。 否则你要交换元素两次!
答案 3 :(得分:0)
我可能会这样做:
#include <algorithm>
void hflip()
{
for(int row = 0; row < numRows; ++row)
std::reverse(picture[row], picture[row] + numCols);
}
答案 4 :(得分:0)
那&#34;笨蛋&#34;看起来像是用错误的x大小绘制的图像。您似乎已经交换了numRows和numCols。 PGM格式首先将大小定义为WIDTH,然后定义为HEIGHT。您将WIDTH表示为图片的列。
负面作品的原因是你以相同的顺序将像素写回来,所以它并不重要。任何你真正关心像素位置的地方都是错误的。
请改为:
pgmIn >> numCols >> numRows >> magicNumber;