Главная страница
Навигация по странице:

  • Введение

  • Исходный код программы Код программы представлен ниже.


  • Контрольные вопросы

  • Отчет по лабораторной работе 4 на тему Перевод цветного изображения в градации серого на cuda


    Скачать 0.53 Mb.
    НазваниеОтчет по лабораторной работе 4 на тему Перевод цветного изображения в градации серого на cuda
    Анкорlaba po RVs
    Дата09.11.2021
    Размер0.53 Mb.
    Формат файлаdocx
    Имя файлаRVS_Andreev_4_laba.docx
    ТипОтчет
    #267329

    Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

    Ордена Трудового Красного Знамени

    Федеральное государственное бюджетное образовательное учреждение высшего образования

    «Московский технический университет связи и информатики»

    Кафедра математической кибернетики и информационных технологий

    Отчет по лабораторной работе №4

    на тему «Перевод цветного изображения в градации серого на CUDA»

    по дисциплине «Распределенные вычислительные системы»

    Выполнил: студент группы

    БИБ2003

    Андреев А. А.

    Руководитель:

    Соловьев А. С.

    Москва

    2021



    Оглавлени


    Введение 3

    Исходный код программы 4

    Входные данные……………………………………………………………………………..6

    Результат работы программы 6

    Вывод 7


    Введение

    Цель работы: требуется выполнить перевод RGB изображения в изображение в градациях серого, имея следующие входные данные: тройка RGB чисел с плавающей точкой, которую необходимо преобразовать в единственное значение с плавающей точкой – интенсивность серого цвета.
    Исходный код программы
    Код программы представлен ниже.


    #include

    #define wbCheck(stmt) \
    do { \
    cudaError_t err = stmt; \
    if (err != cudaSuccess) { \
    wbLog(ERROR, "Failed to run stmt ", #stmt); \
    wbLog(ERROR, "Got CUDA error ... ", cudaGetErrorString(err)); \
    return -1; \
    } \
    } while (0)


    // Местодлявставкикода

    #define TILE_WIDTH 16
    __global__ void rgb2gray(float *grayImage, float *rgbImage, int channels,

    int width, int height) {

    int x = threadIdx.x + blockIdx.x * blockDim.x;

    int y = threadIdx.y + blockIdx.y * blockDim.y;

    if (x < width && y < height) {

    // получаем координату для изображения в градациях серого

    int grayOffset = y * width + x;

    int rgbOffset = grayOffset * channels;

    float r = rgbImage[rgbOffset]; // red value for pixel

    float g = rgbImage[rgbOffset + 1]; // green value for pixel

    float b = rgbImage[rgbOffset + 2]; // blue value for pixel

    // сохраняем изменения масштаба

    // умножаем их на константы с плавающей точкой

    grayImage[grayOffset] = 0.21f * r + 0.71f * g + 0.07f * b;

    }

    }
    int main(int argc, char *argv[]) {
    wbArg_t args;
    int imageChannels;
    int imageWidth;
    int imageHeight;
    char *inputImageFile;
    wbImage_t inputImage;
    wbImage_t outputImage;
    float *hostInputImageData;
    float *hostOutputImageData;
    float *deviceInputImageData;
    float *deviceOutputImageData;

    args = wbArg_read(argc, argv); /* чтениевходныхаргументов */
    inputImageFile = wbArg_getInputFile(args, 0);
    inputImage = wbImport(inputImageFile);
    imageWidth = wbImage_getWidth(inputImage);
    imageHeight = wbImage_getHeight(inputImage);
    // Вданнойлабораторнойзначениеравно 3
    imageChannels = wbImage_getChannels(inputImage);

    // Таккакизображениемонохромное, оносодержиттолько 1 канал
    outputImage = wbImage_new(imageWidth, imageHeight, 1);
    hostInputImageData = wbImage_getData(inputImage);
    hostOutputImageData = wbImage_getData(outputImage);
    wbTime_start(GPU, "Doing GPU Computation (memory + compute)");
    wbTime_start(GPU, "Doing GPU memory allocation");
    cudaMalloc((void **)&deviceInputImageData,
    imageWidth * imageHeight * imageChannels * sizeof(float));
    cudaMalloc((void **)&deviceOutputImageData,
    imageWidth * imageHeight * sizeof(float));
    wbTime_stop(GPU, "Doing GPU memory allocation");
    wbTime_start(Copy, "Copying data to the GPU");
    cudaMemcpy(deviceInputImageData, hostInputImageData,
    imageWidth * imageHeight * imageChannels * sizeof(float),
    cudaMemcpyHostToDevice);


    wbTime_stop(Copy, "Copying data to the GPU");

    ///////////////////////////////////////////////////////
    wbTime_start(Compute, "Doing the computation on the GPU");

    //Местодлявставкикода

    dim3 dimGrid(ceil((float)imageWidth / TILE_WIDTH),

    ceil((float)imageHeight / TILE_WIDTH));

    dim3 dimBlock(TILE_WIDTH, TILE_WIDTH, 1);

    rgb2gray<<>>(deviceOutputImageData,

    deviceInputImageData, imageChannels,

    imageWidth, imageHeight);


    wbTime_stop(Compute, "Doing the computation on the GPU");

    ///////////////////////////////////////////////////////
    wbTime_start(Copy, "Copying data from the GPU");
    cudaMemcpy(hostOutputImageData, deviceOutputImageData,
    imageWidth * imageHeight * sizeof(float),
    cudaMemcpyDeviceToHost);
    wbTime_stop(Copy, "Copying data from the GPU");
    wbTime_stop(GPU, "Doing GPU Computation (memory + compute)");
    wbSolution(args, outputImage);
    cudaFree(deviceInputImageData);
    cudaFree(deviceOutputImageData);
    wbImage_delete(outputImage);
    wbImage_delete(inputImage);

    return 0;
    }
    Входные данные

    Рис. 1 - Исходное изображение
    Результат работы программы

    Рис. 2 - Изображение после выполнения кода



    Рис. 3 – Снимок экрана работы программы

    Вывод

    На данной лабораторной работе я выполнил перевод RGB изображения в изображение в градациях серого.
    Контрольные вопросы


    написать администратору сайта