Presentation is loading. Please wait.

Presentation is loading. Please wait.

PGM Format CS474/674 – Prof. Bebis.

Similar presentations


Presentation on theme: "PGM Format CS474/674 – Prof. Bebis."— Presentation transcript:

1 PGM Format CS474/674 – Prof. Bebis

2 How are images represented?

3 Color images

4 Common image file formats
PGM (Portable Gray Map) PNG (Portable Network Graphics) GIF (Graphic Interchange Format) JPEG (Joint Photographic Experts Group) TIFF (Tagged Image File Format) FITS (Flexible Image Transport System)

5 PGM Image file format (Portable Graymap)
It adheres to the following simple model: Header Data (line by line, no breaks between lines).

6 PGM Image file format (cont.)
Header contains at least: A signature or “magic number” (i.e., a short sequence of bytes for identifying the file format). The columns (M) and rows (N) of the image. The number of quantization levels (L).

7 PGM and related image file formats
PGM is for grayscale images (8 bits/pixel) Closely-related formats are: PBM (Portable Bitmap), for binary images (1 bit/pixel) PPM (Portable Pixelmap), for color images (24 bits/pixel) ASCII or raw storage #Col #Row #Q (usually on a separate line) ASCII Raw

8 Image Class class ImageType { public: ImageType(); // constructor
ImageType(ImageType&); // copy-constructor ~ImageType(); // destructor void getImageInfo(int&, int&, int&); void setImageInfo(int, int, int); void getVal(int, int, int&); void setVal(int, int, int); // more functions ... private: int N, M, Q; //N: # rows, M: # columns int **pixelValue; };

9 Input / Output Functions
C++ routine to read the header of a PGM image: ReadImageHeader.cpp C++ routine to read a PGM image from a file: ReadImage.cpp C++ routine to write a PGM image to a file: WriteImage.cpp

10 An example - Threshold.cpp
void readImageHeader(char[], int&, int&, int&, bool&); void readImage(char[], ImageType&); void writeImage(char[], ImageType&); void main(int argc, char *argv[]) { int i, j, M, N, Q; bool type; int val, thresh; // read image header readImageHeader(argv[1], N, M, Q, type); // allocate memory for the image array ImageType image(N, M, Q);

11 Threshold.cpp (cont’d)
// read image readImage(argv[1], image); cout << "Enter threshold: "; cin >> thresh; // threshold image for(i=0; i<N; i++) for(j=0; j<M; j++) { image.getVal(i, j, val); if(val < thresh) image.setVal(i, j, 0); else image.setVal(i, j, 255); } // write image writeImage(argv[2], image);

12 Reading/Writing PGM images
(2D array of int) (1D array of unsigned char) Use “write” (1D array of unsigned char) (2D array of int) Use “read”

13 Writing a PGM image to a file
void writeImage(char fname[], ImageType& image) int N, M, Q; unsigned char *charImage; ofstream ofp; image.getImageInfo(N, M, Q); charImage = (unsigned char *) new unsigned char [M*N]; // convert integer values to unsigned char int val; for(i=0; i<N; i++) for(j=0; j<M; j++) image.getVal(i, j, val); charImage[i*M+j]=(unsigned char)val; }

14 Writing a PGM image... (cont’d)
ofp.open(fname, ios::out | ios::binary); if (!ofp) { cout << "Can't open file: " << fname << endl; exit(1); } ofp << "P5" << endl; ofp << M << " " << N << endl; ofp << Q << endl; ofp.write( reinterpret_cast<char *>(charImage), (M*N)*sizeof(unsigned char)); if (ofp.fail()) { cout << "Can't write image " << fname << endl; exit(0); } ofp.close(); }

15 Reading a PGM image from a file
void readImage(char fname[], ImageType& image) { int i, j; int N, M, Q; unsigned char *charImage; char header [100], *ptr; ifstream ifp; ifp.open(fname, ios::in | ios::binary); if (!ifp) { cout << "Can't read image: " << fname << endl; exit(1); }

16 Reading a PGM image from a file
// read header ifp.getline(header,100,'\n'); if ( (header[0]!=80) || // 'P' (header[1]!=53) ) { // '5' cout << "Image " << fname << " is not PGM" << endl; exit(1); } ifp.getline(header,100,'\n'); // skip comments while(header[0]=='#') M=strtol(header,&ptr,0); // read M, N N=atoi(ptr);

17 Reading a PGM image …. (cont’d)
ifp.getline(header,100,'\n'); // assumes Q is stored on a separate line Q=strtol(header,&ptr,0); charImage = (unsigned char *) new unsigned char [M*N]; ifp.read( reinterpret_cast<char *>(charImage), (M*N)*sizeof(unsigned char)); if (ifp.fail()) { cout << "Image " << fname << " has wrong size" << endl; exit(1); } ifp.close();

18 Reading a PGM image…(cont’d)
// Convert unsigned characters to integers int val; for(i=0; i<N; i++) for(j=0; j<M; j++) { val = (int)charImage[i*M+j]; image.setVal(i, j, val); }

19 How do I “see” images on my computer?
Unix/Linux: xv, gimp Windows: Photoshop Irfanview

20 How do I convert an image from one format to another?
Use “Save As” option


Download ppt "PGM Format CS474/674 – Prof. Bebis."

Similar presentations


Ads by Google