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

//メインプログラムの終了

4

2 に答える 2

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 オブジェクトに保存することを意味します。実際には、Mat オブジェクトには任意の画像のデータが保存されます。

  cvtColor( img, gray_image, CV_RGB2GRAY );

この行は、オリジナル (RGB) を他のカラー イメージ (GRAY) に変換します。

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

これは、ディレクトリ C://images/ の Mat オブジェクト「gray_image」に保存されている新しい変更された画像を保存します。独自のディレクトリを選択できます

于 2013-01-17T22:24:42.373 に答える
0

jpg 画像は非可逆圧縮を使用します。png 画像を使用する必要があります。

于 2012-11-28T00:23:32.860 に答える