2012-11-27 143 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 /你可以選擇你自己的目錄

相關問題