1 CS4402 – Parallel Computing Lecture 11 Image Processing.

28
1 CS4402 – Parallel Computing Lecture 11 Image Processing

Transcript of 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

Page 1: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

1

CS4402 – Parallel Computing

Lecture 11

Image Processing

Page 2: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

2

Images

Image = rectangular area of colored pixel.

A colour c is defined by four channels c=(a,r,g,b)

where 0<=a,r,g,b<=255.

Important colours:

(0,0,0) is black; (255,255,255) is white.

Digital Image: - A matrix c=(c[i][j],i=0,1,…,w-1;j=0,1,…,h-1). - Four matrices a, r, g, b representing a channel.

Page 3: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

3

Image Data Problem: Given an image grab the image data?

Several C, Java classes available to extract a,r,g,b from gif, jpg etc.

ppm / pnm format for uncompress images has

- header to give the nature, width, height, max gray

- a,r,g,b values for each pixel. http://netpbm.sourceforge.net/doc/ppm.html

Matrix2D is a class to extract the a,r,g,b matrices from ppm images.

e.g. Mat2D_LoadRGBFrom PNM() find the R,G,B data.

Page 4: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

4

Classification of IP

Type of processing: - Low level processing: the pixel data is directly processed.

- High level processing: the pixel data is processed through filters.

Nature of processing:- Point transfs: preserve position and change colour.

- Geometrical transfs: preserve colour and change position.

- Spatial transfs: pixel data is given by some pixel’s neighbors.

- Global transfs: all the pixels contribute a a pixel value.

Page 5: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

5

Parallel Algorithms for IP

IP transformations are examples of embarrassingly comp.- Split the image matrix(ces) on processors.

- Transform each pixel data according to transf’s equation.

- Collect the transformed matrix(ces).

P0 P1 ... P

Page 6: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

6

General Structure of a || Transf

Image1 Image 2

pixelsR

Scatter

grabRGB (P0)

Gather

createImage (P0)

Transform

pixelsG

pixelsB

pixelsR pixelsR pixelsR

pixelsG pixelsG pixelsG

pixelsB pixelsB pixelsB

P0 P1 Pp

newPixelsR

newPixelsG

newPixelsB

newPixelR newPixelR newPixelR

newPixelG newPixelG

newPixelB

newPixelG

newPixelB newPixelB

P0 P1 Pp

numerically

Page 7: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

7

Some PT Image Processing Inversion: Colors are transformed to opposite colors.

R=255-r; G=255-g; B=255-b;

Value = 255 – value;

Brightening up: Colors are stretched toward white.Value = (int)(value * scale) or more correctly

Value = min((int)(value * scale),255)

Stretching colors between min and maxValue = min+(int)(value - min)/(max-min)

Threshold Value = (value<threshold)?0:value.

Page 8: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

8

Inverting a ppm image

Use Matrix2D objects to extract the r,g,b values from a ppm image.1. If Processor 0 then

extract the matrices.

2. Scatter the matrices on the processors.

3. Process the values of each local matrix.

4. Gather the matrices

5. If Processor 0 then create the new ppm image from the new matrices.

Page 9: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

9

Inverting a ppm imageUse Matrix2D objects to extract the r,g,b values from a ppm image.

If Processor 0 then extract the matrices.Scatter the matrices on the processors.Process the values of each local matrix.Gather the matricesIf Processor 0 then create the new ppm image from the new matrices.

if (rank == 0){matR= Mat2D_createNull(); matG= Mat2D_createNull(); matB= Mat2D_createNull();Mat2D_loadRGBFromPNM(matR, matG, matB,"./im1.ppm"); // extract the r,g,b in 3 Matrix2D objects

numRows = Mat2D_getnRows(matG); numCols = Mat2D_getnCols(matG);rData = Mat2D_getDataChar(matR); // get the matrices from the 3 Matrix2D objectsgData = Mat2D_getDataChar(matG);bData = Mat2D_getDataChar(matB);

numPixels = numRows * numCols; pixelsPerProc = numPixels/size;}

Page 10: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

10

Inverting a ppm imageUse Matrix2D objects to extract the r,g,b values from a ppm image.

If Processor 0 then extract the matrices.Scatter the matrices on the processors.Process the values of each local matrix.Gather the matricesIf Processor 0 then create the new ppm image from the new matrices.

MPI_Bcast(&pixelsPerProc, 1, MPI_INT, 0, MPI_COMM_WORLD);

MPI_Scatter(*rData,pixelsPerProc,MPI_UNSIGNED_CHAR,recvbufR,pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);MPI_Scatter(*gData,pixelsPerProc,MPI_UNSIGNED_CHAR,recvbufG,pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);MPI_Scatter(*bData,pixelsPerProc,MPI_UNSIGNED_CHAR,recvbufB,pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);

for (i=0; i<pixelsPerProc; i++){recvbufR[i] =(unsigned char) 255 - recvbufR[i];recvbufG[i] =(unsigned char) 255 - recvbufG[i];recvbufB[i] =(unsigned char) 255 - recvbufB[i];

}

MPI_Gather(recvbufR,pixelsPerProc,MPI_UNSIGNED_CHAR,*rData,pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);MPI_Gather(recvbufG,pixelsPerProc,MPI_UNSIGNED_CHAR,*gData,pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);MPI_Gather(recvbufB,pixelsPerProc,MPI_UNSIGNED_CHAR,*bData,pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);

Page 11: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

11

Inverting a ppm imageUse Matrix2D objects to extract the r,g,b values from a ppm image.

If Processor 0 then extract the matrices.Scatter the matrices on the processors.Process the values of each local matrix.Gather the matricesIf Processor 0 then create the new ppm image from the new matrices.

if (rank == 0){

matR->data = rData;matG->data = gData;matB->data = bData;

Mat2D_saveRGBToPNM(matR,matG,matB,"./outColourInvert.ppm");

}

Page 12: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

12

Page 13: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

13

Page 14: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

14

Parallel Code for the Histogram

1. if rank ==0 then

- grab rData, gData, bData.

2. Scatter the matrices rData, gData, bData.

3. Generate the distributions rHist, gHist, bHist

4. Reduce the array rHist, gHist, bHist

5. Visualise the histograms

Page 15: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

15

Histogram Equalisation

Histograms have statistical information:

- least and most used value

- peeks, valleys, etc

- similar distribution of color flat histograms

Histogram Equalisation

- the histogram is stretched over the whole band

Page 16: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

16

Page 17: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

17

Page 18: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

18

Page 19: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

19

Page 20: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

20

Page 21: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

21

Page 22: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

22

Page 23: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

23

Page 24: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

24

Page 25: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

25

Example: Averagingif (rank == 0){

matR= Mat2D_createNull(); matG= Mat2D_createNull(); matB= Mat2D_createNull();Mat2D_loadRGBFromPNM(matR, matG, matB,"./im1.ppm");// extract the r,g,b in 3 Matrix2D objects

numRows = Mat2D_getnRows(matG); numCols = Mat2D_getnCols(matG); // get the matrices from the 3 Matrix2D objects

rData = Mat2D_getDataChar(matR);gData = Mat2D_getDataChar(matG);bData = Mat2D_getDataChar(matB);

}

Page 26: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

26

MPI_Bcast(&numRows, 1, MPI_INT, 0, MPI_COMM_WORLD);MPI_Bcast(&numCols, 1, MPI_INT, 0, MPI_COMM_WORLD);pixelsPerProc = numRows * numCols / size;

// allocate the local matricesrLocalData = alloc_matrix(numRows/size,numCols); rNewLocalData = alloc_matrix(numRows/size,numCols);gLocalData = alloc_matrix(numRows/size,numCols); gNewLocalData = alloc_matrix(numRows/size,numCols);bLocalData = alloc_matrix(numRows/size,numCols); bNewLocalData = alloc_matrix(numRows/size,numCols);

// scatter the image data onto processorsMPI_Scatter(&rData[0][0],pixelsPerProc,MPI_UNSIGNED_CHAR,&rLocalData[0][0], pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);MPI_Scatter(&gData[0][0],pixelsPerProc,MPI_UNSIGNED_CHAR,&gLocalData[0][0], pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);MPI_Scatter(&bData[0][0],pixelsPerProc,MPI_UNSIGNED_CHAR,&bLocalData[0][0], pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);

// do image processing ... give the numerical transformations of the pixel valuesfor (i=0; i<nrRows/size; i++)for (j=0; j<nrCols; j++){

rNewLocalData[i][j] =average(i, j, numRows/size, numCols, rLocalData[i][j]); gNewLocalData[i][j] =average(i, j, numRows/size, numCols, gLocalData[i][j]); bNewLocalData[i][j] =average(i, j, numRows/size, numCols, bLocalData[i][j]);

}

Page 27: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

27

MPI_Gather(&rNewLocalData[0][0],pixelsPerProc,MPI_UNSIGNED_CHAR,&rData[0][0], pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);

MPI_Gather(&gNewLocalData[0][0],pixelsPerProc,MPI_UNSIGNED_CHAR,&gData[0][0], pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);

MPI_Gather(&bNewLocalData[0][0],pixelsPerProc,MPI_UNSIGNED_CHAR,&bData[0][0], pixelsPerProc,MPI_UNSIGNED_CHAR,0,MPI_COMM_WORLD);

if (rank == 0){// update the image data in the Matrix2d OBJECTS

matR->data = rData;matG->data = gData;matB->data = bData;

// Create the output image.Mat2D_saveRGBToPNM(matR,matG,matB,"./outIm1.ppm");

}

MPI_Finalize();

Page 28: 1 CS4402 – Parallel Computing Lecture 11 Image Processing.

28

int average(int i0, int j0, int n, int m, int ** data){

int s = 0, nr=0, j, i;for(i=-1;i<2;i++)for(j=-1;j<2;j++){

if(i0+i<0 || i0+i>=n ||j0+j<0 || j0+j>=m)continue;

nr++;s+=data[i0+i][j0+j];

}return (int)s/nr;}