Parallel Programming

Joker - Project 馃殌

Images transformation

By: Mondalgo Tapia, Juan Carlos

Parallel Programming 馃殌

Introducci贸n

Herramienta de transformaci贸n de im谩genes. Desde escala a grises, redimensionamiento, hasta filtros de convoluci贸n (desenfoque gaussiano). Comparando el rendimiento de la versi贸n secuencial y paralela.

Parallel Programming 馃殌

Generalidades:

Parallel Programming 馃殌

1. Escala a grises 鉁达笍

Parallel Programming 馃殌

1.1. Explicaci贸n gr谩fica:

Parallel Programming 馃殌

1.2. Explicaci贸n paralela:

alt text

Donde:

  • n = N煤mero total de n煤cleos de CPU disponibles.
Parallel Programming 馃殌

1.3. Implementaci贸n:

unsigned char *convertToGrayscaleParallel(unsigned char *data, int width, int height, int channels)
{
    unsigned char *grayscaleData = (unsigned char *)malloc(width * height);

    int numThreads = std::thread::hardware_concurrency();
    int rowsPerThread = height / numThreads;
    std::vector<std::future<void>> futures;

    for (int i = 0; i < numThreads; ++i)
    {
        int startRow = i * rowsPerThread;
        int endRow = (i == numThreads - 1) ? height : startRow + rowsPerThread;
        futures.emplace_back(std::async(std::launch::async, convertToGrayscaleThread, data, grayscaleData, width, height, channels, startRow, endRow));
    }

    for (auto &future : futures)
    {
        future.wait();
    }

    return grayscaleData;
}
Parallel Programming 馃殌
void convertToGrayscaleThread(unsigned char *data, unsigned char *grayscaleData, int width, int height, int channels, int startRow, int endRow)
{
    for (int y = startRow; y < endRow; y++)
    {
        for (int x = 0; x < width; x++)
        {
            // Calcular el valor promedio de los canales de color
            int sum = 0;
            for (int c = 0; c < channels; c++)
            {
                sum += data[(y * width + x) * channels + c];
            }
            int average = sum / channels;
            // Asignar el mismo valor a cada canal en la imagen en escala de grises
            grayscaleData[y * width + x] = average;
        }
    }
}
Parallel Programming 馃殌

2. Redimensi贸n 馃寑

Interpolaci贸n bilineal

Parallel Programming 馃殌

2.1. Explicaci贸n gr谩fica:

El proceso de interpolaci贸n bilineal implica calcular un nuevo valor para un p铆xel en la imagen redimensionada tomando en cuenta los cuatro p铆xeles m谩s cercanos en la imagen original y ponderando sus valores de acuerdo a su distancia relativa al p铆xel deseado.

Parallel Programming 馃殌
  • : Posici贸n del p铆xel en la imagen redimensionada.
  • : Posici贸n del p铆xel en la imagen original.
  • : Posici贸n del p铆xel superior izquierdo m谩s cercano en la imagen original.
  • : Factores de interpolaci贸n.
  • : Pesos de interpolaci贸n de los 4 p铆xeles m谩s cercanos.
Parallel Programming 馃殌

alt text

Parallel Programming 馃殌

3. Desenfoque Gaussiano 馃寑

Gaussian Blur

Parallel Programming 馃殌

3.1. Explicaci贸n gr谩fica:

  • Obtenemos el kernel convolution con la f贸rmula de distribuci贸n gaussiana en el espacio bidimensional es la siguiente:

Parallel Programming 馃殌
  • Alinear el centro del kernel de convoluci贸n con el elemento correspondiente de la matriz a procesar. Los elementos correspondientes se multiplican y suman para obtener el resultado.

Parallel Programming 馃殌

Performance 馃搱

Parallel Programming 馃殌

Redimensi贸n:

small medium large
Parallel Programming 馃殌

Gaussian Blur:

small medium large
Parallel Programming 馃殌

Grayscale:

small medium large
Parallel Programming 馃殌

隆隆Gracias!! 馃殌

Parallel Programming 馃殌