gpt4 book ai didi

c++ - pgm 二进制文件操作中的图像失真

转载 作者:行者123 更新时间:2023-11-28 05:29:44 24 4
gpt4 key购买 nike

我正在尝试对 pgm 执行卷积类型图像 P5 (二进制)使用以下设置:

输入输出数组

vector<vector<char>> image(rows, vector<char>(cols, '\0'));
vector<vector<char>> out(rows, vector<char>(cols, '\0'));

const int SIZE = 3;

过滤器

vector<vector<int>> filter = { { 0, -1, 0 }, { -1, 5, -1 }, { 0, -1, 0 } };

将二进制数据插入图像数组

我正在像这样读取 PGM 文件:

getline(infile, type);
//getline(infile, comment);
infile >> rows >> cols;
getline(infile, line);
getline(infile, highest);
//getline(infile, line);

for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
infile >> image[i][j]; //infile is from filestream


outfile.open("output.pgm");

//Insert default header attributes into output pgm file.
outfile << type << "\n" << rows << " " << cols << "\n" << maxpx << "\n";


for (int i = SIZE / 2; i < rows - SIZE / 2; i++)
{
for (int j = SIZE / 2; j < cols - SIZE / 2; j++)
{
uint8_t sum = 0;
for (int k = -SIZE / 2; k <= SIZE / 2; k++)
{
for (int l = -SIZE / 2; l <= SIZE / 2; l++)
{
sum += image[i+k][j+l] * filter[k + SIZE / 2][l + SIZE / 2];
}
}
out[i][j] = sum;
}
}

将二进制数据写入out文件

for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
outfile << out[i][j];

运行代码时我没有收到任何错误,但图像失真了。我可以清楚地辨认出输出图像的某些部分,但它并不完整。

不确定是否与我的操作有关。

更新:

我改变了uint8_t到 char,但我仍然遇到同样的错误。

  1. 当我改变outfile << out[i][j];outfile << image[i][j];所以我可以取回实际图像,但看起来我将文件读入 image 的方式可能存在一些问题 vector 。不知道在这一点上如何。我得到这张图片 enter image description here

Lena.pgm file

MCVE(Pastebin)

最佳答案

我不是 C++ 专家,但我相信您不能(或可能不应该)使用 >>> 运算符来读取二进制文件。

我注意到你的图像在有黑色像素的地方出错了,我相信这些空字节被 ifstream 错误地解释了,而你实际上根本不希望它们被解释.我降低了图像的对比度,因此像素范围不再是 0-255,而是 67-197,一切正常。因此,当您的图像中没有低值时它会起作用。

我认为您需要更改从以下位置读取二进制图像数据的方式:

infile >> image[i][j];

类似于:

infile.read((char*)&image[i][j],1);

或者可能使用 get() 的东西。抱歉,我不能说得更准确,因为 C++ 不是我的强项,但希望您现在可以更进一步。如果有人想在评论中解释我在说什么 - 请随时教我!谢谢。

关于c++ - pgm 二进制文件操作中的图像失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39797167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com