Image 加载然后写入图像
我使用opencv读取图像并再次保存,但当我稍后读取时,数据不相同,也就是说,在我读取图像后,我保存了它,然后复制保存的图像并读取该图像中的数据,但数据将与以前不同,我编写了小代码来执行以下操作 1-读取图像 2-保存图像 3-将图像数据保存到文本文件中 4-从步骤2读取保存的图像 5-将图像的值与文本文件的值进行比较并一起打印 我的代码是Image 加载然后写入图像,image,opencv,load,Image,Opencv,Load,我使用opencv读取图像并再次保存,但当我稍后读取时,数据不相同,也就是说,在我读取图像后,我保存了它,然后复制保存的图像并读取该图像中的数据,但数据将与以前不同,我编写了小代码来执行以下操作 1-读取图像 2-保存图像 3-将图像数据保存到文本文件中 4-从步骤2读取保存的图像 5-将图像的值与文本文件的值进行比较并一起打印 我的代码是 #include<stdio.h> #include<stdlib.h> #include<math.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include <time.h>
#include <stdint.h>
#include "highgui.h"
IplImage *PlainImage=0,*CipherImage=0,*DecPlainImage=0;
void func_printimage()
{
// create a window
cvNamedWindow("Plain Image",CV_WINDOW_AUTOSIZE);
cvMoveWindow("Plain Image", 800, 600);
// show the image
cvShowImage("Plain Image", PlainImage );
// wait for a key
cvNamedWindow("Cipher Image",CV_WINDOW_AUTOSIZE);
cvMoveWindow("Cipher Image", 800, 600);
// show the image
cvShowImage("Cipher Image", CipherImage );
cvSaveImage("CipherImage.jpg",CipherImage,0);
cvWaitKey(0);
}
int main()
{
//i j and k used as counters
int i,j,step,dep,k,ch,L,C,P,sum=0;
uchar *data_byte;
//Define CPU time parameters for each Layer
PlainImage=cvLoadImage("PlainImage.jpg",3);
CipherImage=cvLoadImage("PlainImage.jpg",3);
L = PlainImage->height;
C = PlainImage->width;
P = PlainImage->nChannels;
step = PlainImage->widthStep;
data_byte=CipherImage->imageData;
printf("Image Information are:\nL=%d\n",L);
printf("C=%d\n",C);
printf("P=%d\n",P);
system("pause");
FILE *f1;
f1 = fopen ("cipher1.txt", "wt");
fprintf(f1,"%d\t%d\t%d\t%d\t",L,C,P,CipherImage->depth);
for(k=0;k<L*C*P;k++)
{
fprintf(f1,"%d\t",data_byte[k]);
}
fclose (f1);
func_printimage();
for(k=0;k<L*C*P;k++)
{
data_byte[k]=0;
}
f1 = fopen ("cipher1.txt", "rt");
fscanf (f1,"%d", &L);
fscanf (f1,"%d", &C);
fscanf (f1,"%d", &P);
fscanf (f1,"%d", &dep);
CipherImage=cvLoadImage("CipherImage.jpg",3);
data_byte=CipherImage->imageData;
printf("Image Information are:\nL=%d\n",L);
printf("C=%d\n",C);
printf("P=%d\n",P);
system("pause");
for(k=0;k<L*C*P;k++)
{
fscanf (f1,"%d", &i);
sum+=abs(i-data_byte[k]);
printf("i=%d data=%d\n",i,data_byte[k]);
}
printf("difference=%d\n",sum);
fclose (f1);
system("pause");
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括“highgui.h”
IplImage*PlainImage=0,*CipherImage=0,*DecPlainImage=0;
void func_printimage()
{
//创建一个窗口
cvNamedWindow(“普通图像”,CV_窗口_自动调整大小);
cvMoveWindow(“普通图像”,800600);
//显示图像
cvShowImage(“普通图像”,普通图像);
//等钥匙
cvNamedWindow(“密码图像”,CV_窗口_自动调整大小);
cvMoveWindow(“加密图像”,800600);
//显示图像
cvShowImage(“密码图像”,CipherImage);
cvSaveImage(“ciphermage.jpg”,ciphermage,0);
cvWaitKey(0);
}
int main()
{
//i j和k用作计数器
int i,j,step,dep,k,ch,L,C,P,sum=0;
uchar*数据字节;
//为每个层定义CPU时间参数
PlainImage=cvLoadImage(“PlainImage.jpg”,3);
CipherImage=cvLoadImage(“PlainImage.jpg”,3);
L=平面图像->高度;
C=平面图像->宽度;
P=平面图像->n通道;
步骤=平面图像->宽度步骤;
数据\ u字节=密码图像->图像数据;
printf(“图像信息为:\nL=%d\n”,L);
printf(“C=%d\n”,C);
printf(“P=%d\n”,P);
系统(“暂停”);
文件*f1;
f1=fopen(“cipher1.txt”,“wt”);
fprintf(f1,“%d\t%d\t%d\t%d\t”,L、C、P、CipherImage->深度);
对于(k=0;kjpg图像,请使用。
您应该使用png图像。在本文中,我将向您展示如何从所选目录加载图像,然后将其转换为灰色,然后将新的(修改过的)图像存储在目录C:\images中
代码如下:
#include <cv.h>
#include <highgui.h>,
using namespace cv;
int main( )
{
Mat img;
img = imread(“C:\\prado.jpg”, 1 );
if( !img.data )
{
printf( ” No image data \n ” );
return -1;
}
else
prinf(“Your program is working well”);
Mat gray_image;
cvtColor( img, gray_image, CV_RGB2GRAY );
imwrite( “C://images/Gray_Image.jpg”, gray_image);
imshow( “real image”, img);
imshow( “Gray image”, gray_image);
waitKey(0);
return 0;
}
这意味着从我的目录中获取图像并将其存储在Mat对象中,这里的Mat对象是“img”,实际上Mat对象存储任何图像的数据
cvtColor( img, gray_image, CV_RGB2GRAY );
该行将原始图像(RGB)转换为其他颜色图像(灰色)
这一个存储已存储在Mat对象“gray_image”中的新修改图像在目录C://images/中,您可以选择自己的目录,但在我的项目中,我需要jpg格式,我可以使用opencv Com保存图像而不进行有损压缩吗?SJPG图像具有用于压缩的质量参数。如果将其设置为100%,理论上不会丢失。请查看保存函数是否具有用于质量的额外参数。是,但是使用openCv我没有发现如何将质量调整为100%,但是与您的答案相关,我将图像类型从JPG更改为PNG,并且函数正常工作,但是我仍然需要知道如何在C代码中保存JPG图像而不丢失信息
cvtColor( img, gray_image, CV_RGB2GRAY );
imwrite( “C://images/Gray_Image.jpg”, gray_image);