2012-11-27 87 views
0

我使用opencv读取图像并再次保存,但是当我稍后阅读它时,数据不一样,我的意思是在读取图像后保存它,然后复制保存的图像并读取数据在这个图像里但数据不会像以前一样,我写小代码做以下操作 1-读取图像 2-保存图像 3-将图像数据保存到文本文件 4-读取已保存的图像步骤2 5- 的图像的值进行比较,以文本文件的值,并打印出来一起加载然后写图像

我的代码是

#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; 
} 

//结束主程序

回答

0

jpg图片使用Lossy Compression。 你应该使用PNG图像。

+0

但是在我的项目中我需要jpg格式,我可以保存图像而没有使用opencv命令进行有损压缩 –

+0

jpg图像具有压缩质量参数。如果你把它提高到100%,理论上是没有损失的。看看你的保存功能是否有一个额外的质量参数。 – cohadar

+0

是的,但使用openCv我没有找到如何将质量调整为100%,但与您的答案有关我将图像类型从JPG更改为PNG,并且该功能正常工作,但仍然需要知道如何保存jpg图像在C代码没有有损信息 –

0

在这篇文章中,我会告诉你如何从你选择的目录加载图像,然后将其转换成灰色,然后将新的(修改过的)图像存储在目录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 img = imread(“C:\\prado.jpg”, 1); 

这意味着,从我的目录中获取图像,并将其存储在垫目标是“IMG”在这里,实际上Mat对象存储任何图像的数据。

cvtColor(img, gray_image, CV_RGB2GRAY); 

此行转换originial(RGB)转换成其它颜色的图像(灰色)

imwrite(“C://images/Gray_Image.jpg”, gray_image); 

这一个存储新的修改后的图像,其已经在目录C一直处于垫对象“gray_image”店:// images /你可以选择你自己的目录

相关问题