2 gzrjzcx gzrjzcx 于 2016.05.07 23:14 提问

c语言以二进制读取图片问题

小弟新手刚学数字图像处理,现在需要做一个模板卷积
程序编完了 但是对图片的处理总是不对
我把图片不做模板卷积只是读进去在存出来,发现图片已经变化了。
但是查了很久fread函数和fwrite函数,不知道哪里错了

大神们求拯救帮忙看看
程序很简单
define的想法就是用一维数组表示二维数组

#include
using namespace std;

#define Twoto1(i,j,w) i*w+j

void createimage(unsigned char *&img, int w, int h)
{img = new unsigned char[w*h];}

void delateimage(unsigned char*img)
{delete []img;}

void readimage(unsigned char*img, int w, int h, char *fname)
{
FILE *fp;
fopen_s(&fp,fname, "rb");
if (fp == NULL){ cout << "error" << endl; return; }
size_t result;
result=fread(img , sizeof(unsigned char), w*h, fp);
if (result != w*h)
{
cout << "Reading error" << endl;
return;
}
else
cout << "Reading Ok!" << endl;

fclose(fp);

}

void mobanjuanji(unsigned char image, unsigned char*image1, int w, int h, float moban[5][5])
{
for (int i = 0; i for (int j = 0; j if (iw - 3 || j>h - 3)
image1[Twoto1(i,j,w)] = 0;
else
{
float temp = 0;
for (int m = 0; m<5; m++)
for (int n = 0; n<5; n++)
{
temp += (image[Twoto1(i-2+m,j-2+n,w)]
moban[m][n]);

                }
            if (temp>255) image1[Twoto1(i, j, w)] = 255;
            else if (temp<0) image1[Twoto1(i, j, w)] = 0;
            else image1[Twoto1(i, j, w)] = temp;
        }

}

void saveimage(unsigned char *img, int w, int h, char *fname)
{
FILE *fp;
fopen_s(&fp, fname, "wb");
if (fp == NULL) { cout << "error" << endl; return; }
size_t result;
result = fwrite(img, sizeof(unsigned char), w*h, fp);
if (result != w*h)
{
cout << "Write error" << endl;
return;
}
else
cout << "Write Ok!" << endl;
fclose(fp);

}

void main()
{
unsigned char *img;
unsigned char *img1;
float moban[5][5] = { {0,0,0,0,0},{0, -1, 0, 1, 0 }, { 0, -2, 0, 2, 0 }, { 0, -1, 0, 1, 0 }, { 0,0,0,0,0 } };
//float moban[5][5] = { 0 };
int w = 512, h = 512;
createimage(img, w, h);
createimage(img1, w, h);
readimage(img, w, h, "E:\ss.raw");
mobanjuanji(img, img1,w, h, moban);
saveimage(img, w, h, "E:\ss_1.raw");
saveimage(img1, w, h, "E:\ss_2.raw");
delateimage(img);
delateimage(img1);
}
原图
直接读取不做卷积直接输出得到的图片
做卷积得到的图片

第一张是原图
第二张是直接读进去不作处理存出来
第三张是做卷积过后
可以看到貌似不做处理直接读出来 图片也是和原来不一样了- -
求帮忙看看呀

谢谢大家

4个回答

CSDNXIAOD
CSDNXIAOD   2016.05.07 23:22

C语言 二进制文件的读取
c语言文件操作,读取二进制文件发现0x1A读取不了
C语言二进制文件读取解析
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

shangguanwaner
shangguanwaner   2016.05.08 03:58

你得考虑到原图片的格式。按你代码的意思,是Raw格式的,那一个像素占用的空间,不一定是你代码中假定1个字节哦。
原图是彩色的,可以肯定的说,绝对不会是一个像素占用一个字节。
所以,读取像素这一步就错了。

gzrjzcx
gzrjzcx 不好意思我忘记说了 读取之前我是先用ps转成raw格式并且像素设置为512*512 用黑白的lena图读取在存出来还是乱的
一年多之前 回复
gzrjzcx
gzrjzcx 不好意思我忘记说了
一年多之前 回复
havedream_one
havedream_one   2016.05.08 11:06

具体应该看文件是怎么在文件中存储的

havedream_one
havedream_one   2016.05.08 11:07
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!