Changes

Jump to: navigation, search

GPU621/Group 3

2,872 bytes added, 19:35, 9 April 2023
OpenMP Implementation Summary
OpenMP provides extremely simple implementation, especially the process which we are using in our code. In this process we were able to simply use a ''#pragma parallel for'' declaration for the OpenMP API to parallelize the process. With this we saw at the operations being performed at a quarter of the time it took the serial version of these processes.
==='''Image Processing, parallelized with OpenMP'''===  ===='''Class Declaration'''==== In this class declaration for what will hold the OpenMP parallelized functionality we include a Laplacian kernel which will be applied to the sample images in order to sharpen details. How this is achieved is essentially highlighting areas on a greyscale version of the orignal image where the picture goes quickly from light to dark, and applies that highlight like a filter over the original image. <syntaxhighlight>#include <cmath>#include <vector>#include <opencv2/core.hpp>#include <opencv2/opencv.hpp>#include <iostream>#include <omp.h> //class to hold the functionality for openMP img processing class openMP_imgProcessor { //laplacian kernel used in sharpening std::vector<std::vector<double>> LapKernel_ = { {0, 0, 1, 0, 0}, {0, 1, 2, 1, 0}, {1, 2, -7, 2, 1}, {0, 1, 2, 1, 0}, {0, 0, 1, 0, 0} }; public:openMP_imgProcessor() { omp_set_num_threads(15); } void sharpenImg(cv::Mat& image); void brightenImg(cv::Mat& image, int brightnessLvl);};</syntaxhighlight> <syntaxhighlight>#include "openMP_imgProc.h" void openMP_imgProcessor::sharpenImg(cv::Mat& image) { //supressing OpenCV messages std::streambuf* coutbuf = std::cout.rdbuf(); std::cout.rdbuf(nullptr); // Convert the image to grayscale cv::Mat grayscale; cv::cvtColor(image, grayscale, cv::COLOR_BGR2GRAY);  // Apply the kernel to the grayscale image //finds areas with quick jumps from dark to light, increases contrast there #pragma omp parallel for for (int x = 1; x < image.cols - 1; x++) { for (int y = 1; y < image.rows - 1; y++) { double sum = 0.0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { sum += grayscale.at<uchar>(y + j, x + i) * LapKernel_[i + 1][j + 1]; } } //apply filter for (int c = 0; c < 3; c++) { image.at<cv::Vec3b>(y, x)[c] = cv::saturate_cast<uchar>(image.at<cv::Vec3b>(y, x)[c] + sum * 0.99); } } }  //stop supressing std::cout.rdbuf(coutbuf);} void openMP_imgProcessor::brightenImg(cv::Mat& image, int brightnessLvl) { //supressing OpenCV messages std::streambuf* coutbuf = std::cout.rdbuf(); std::cout.rdbuf(nullptr);  int width = image.cols; int height = image.rows; int channels = image.channels();  #pragma omp parallel for for (int row = 0; row < height; row++) { for (int col = 0; col < width; col++) { for (int c = 0; c < channels; c++) { uchar& pixel = image.at<cv::Vec3b>(row, col)[c]; pixel = cv::saturate_cast<uchar>(pixel + brightnessLvl); } } }  //stop supressing std::cout.rdbuf(coutbuf);}</syntaxhighlight> 
[[File:OpenMP_imgProc_header.txt]]
 
[[File:OpenMP_imgProc.txt]]
72
edits

Navigation menu