19,472
社区成员
发帖
与我相关
我的任务
分享
Mat image_dst;
if (!isRGB)
{
image_dst = imread(image_name,0);
}
else
{
image_dst = imread(image_name,1);
}
if(image_dst.empty())
{
return -1;
} //是否加载成功
imshow(image_name,image_dst);
width = image_dst.cols;
height = image_dst.rows;
int channel = image_dst.channels();
int step = width * channel* 1;
uchar* ps = NULL;
p1 = new BYTE[width*height*channel+8];
for (int i = 0; i < height; i++)
{
ps = image_dst.ptr<uchar>(i);
for (int j = 0; j < width; j++)
{
if (1 == channel)
{
*(p1 + i*step + j) = ps[j];
}
else if (3 == channel)
{
*(p1 + i*step + j*3) = ps[j*3 + 2];
*(p1 + i*step + j*3 + 1) = ps[j*3 + 1];
*(p1 + i*step + j*3 + 2) = ps[j*3];
}
}
}
if(!isRGB)
{
OrgImg=p1+8-int(p1)%8;
p2=new BYTE[width*height+8];
ResImg=p2+8-int(p2)%8;
t2=clock();
GrayImageProcess(OrgImg,width,height,ResImg);
t1=clock();
printf("*****灰度图像处理结果******************\n");
cout<<"运行时间:"<<t1-t2<<"ms"<<endl;
Measure(ResImg,width,height,emee,ame);
cout<<"EMEE:"<<emee<<endl;
suc=Write8BitImg2BmpFile(ResImg,width,height,"result_1.bmp");
}
else
{
OrgImg=p1+8-int(p1)%8;
p2=new BYTE[width*height*3+8];
ResImg=p2+8-int(p2)%8;
t2=clock();
ColorImageProcess(OrgImg,width,height,ResImg);
t1=clock();
cout<<"运行时间:"<<t1-t2<<"ms"<<endl;
t2=clock();
suc=Write24BitImg2BmpFile(ResImg,width,height,"result_1.bmp");
ColorImageProcess2(OrgImg,width,height,ResImg);
t1=clock();
cout<<"运行时间:"<<t1-t2<<"ms"<<endl;
suc=Write24BitImg2BmpFile(ResImg,width,height,"result_2.bmp");
}
Mat image_dst;
if (!isRGB)
{
image_dst = imread(image_name,0);
}
else
{
image_dst = imread(image_name,1);
}
if(image_dst.empty())
{
return -1;
} //是否加载成功
imshow(image_name,image_dst);
width = image_dst.cols;
height = image_dst.rows;
int channel = image_dst.channels();
int step = (width * 24+31)/8;
step = width*channel;
//step = step/4*4;
uchar* ps = NULL;
p1 = new BYTE[width*height*channel+8];
//size_mem = sizeof(p1);
/*这部分逐个像素表示图像。像素是从下到上、从左到右保存的。每个像素使用一个或者多个字节表示。
如果一个图像水平线的字节数不是4的倍数,这行就使用空字节补齐,通常是ASCII码0。
范例: 有一张5*5的图片,应该会有25个pixels,但是因为5不是4的倍数所以会显示成:
xxxxx000 xxxxx000 xxxxx000 xxxxx000 xxxxx000
x代表调色盘的编号 0代表Null_character
*/
for (int i = 0; i < height; i++)
{
ps = image_dst.ptr<uchar>(i);
int bmp_i = height - i;//opencv mat需要反转一下从左下角开始赋值
for (int j = 0; j < width; j++)
{
if (1 == channel)
{
*(p1 + bmp_i*step + j) = ps[j];
}
else if (3 == channel)
{ //按照bgr三通道分别赋值
*(p1 + bmp_i*step + j*3) = ps[j*3];
*(p1 + bmp_i*step + j*3 + 1) = ps[j*3 + 1];
*(p1 + bmp_i*step + j*3 + 2) =ps[j*3 + 2] ;
}
}
}
我重新写了一下
if ( ch == '1')
isRGB=false;
else if ( ch == '2')
isRGB=true;
// open file
string image_name;
cout<<endl<<"输入图像名:";
cin>>image_name;
Mat image_dst;
if (!isRGB)
{
image_dst = imread(image_name,0);
}
else
{
image_dst = imread(image_name,1);
}
if(image_dst.empty())
{
return -1;
} //是否加载成功
imshow(image_name,image_dst);
width = image_dst.cols;
height = image_dst.rows;
int channel = image_dst.channels();
int step = (width * 24+31)/8;
step = width*channel;
//step = step/4*4;
uchar* ps = NULL;
p1 = new BYTE[width*height*channel+8];
//size_mem = sizeof(p1);
/*这部分逐个像素表示图像。像素是从下到上、从左到右保存的。每个像素使用一个或者多个字节表示。
如果一个图像水平线的字节数不是4的倍数,这行就使用空字节补齐,通常是ASCII码0。
范例: 有一张5*5的图片,应该会有25个pixels,但是因为5不是4的倍数所以会显示成:
xxxxx000 xxxxx000 xxxxx000 xxxxx000 xxxxx000
x代表调色盘的编号 0代表Null_character
*/
for (int i = 0; i < height; i++)
{
ps = image_dst.ptr<uchar>(i);
int bmp_i = height - i;//opencv mat需要反转一下从左下角开始赋值
for (int j = 0; j < width; j++)
{
if (1 == channel)
{
*(p1 + bmp_i*step + j) = ps[j];
}
else if (3 == channel)
{ //按照bgr三通道分别赋值
*(p1 + bmp_i*step + j*3) = ps[j*3];
*(p1 + bmp_i*step + j*3 + 1) = ps[j*3 + 1];
*(p1 + bmp_i*step + j*3 + 2) =ps[j*3 + 2] ;
}
}
}
结果效果不对啊,后面图片右边还空出来一片。。。