openmp 双线性插值

#include "pch.h"
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
#include<ctime>
#include <omp.h>
using namespace cv;
using namespace std;

Mat BilinearInter(Mat &srcImage, double kx, double ky);
Mat BilinearInterParallel(Mat &srcImage, double kx, double ky);


int main()
{
clock_t startTime, endTime;
Mat img = imread("C:\\Users\\91756\\Desktop\\test.jpg");
/*Mat oimg;
img.copyTo(oimg);*/
if (img.empty()) {
cout << "empty";
return -1;
}
startTime = clock();
Mat resultImage = BilinearInter(img, 2, 2);
endTime = clock();
cout << "The run time is: " << (double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;

startTime = clock();
Mat resultImage1 = BilinearInterParallel(img, 2, 2);
endTime = clock();
cout << "The run time is: " << (double)(endTime - startTime) / CLOCKS_PER_SEC << "s" << endl;

imwrite("C:\\Users\\91756\\Desktop\\高斯滤波结果_串行1.jpg", resultImage1);

return 0;
}

Mat BilinearInter(Mat &srcImage, double kx, double ky)
{
//获取输出图像的分辨率
int nRows = cvRound(srcImage.rows*kx);
int nCols = cvRound(srcImage.cols*ky);
int k;
Mat resultImage(nRows, nCols, srcImage.type());
for (k = 0; k < 3; k++)
{
cout << k << endl;
for (int i = 0; i < nRows; i++)
{
for (int j = 0; j < nCols; j++)
{
//获取目标图像(i,j)在原图中的坐标
double xm = i / kx;
double ym = j / ky;

//取出映射到原图的坐标的整数部分
int xi = (int)xm;
int yi = (int)ym;

//取出偏移量
double xs = xm - xi;//小数部分
double ys = ym - yi;

int x11 = xi + 1;//整数部分加1
int y11 = yi + 1;

//边缘点
if (x11 > (srcImage.rows - 1))
x11 = xi - 1;
if (y11 > (srcImage.cols - 1))
y11 = yi - 1;

// bgr
resultImage.at<Vec3b>(i, j)[k] = (int)(srcImage.at<Vec3b>(xi, yi)[k] * (1 - xs)*(1 - ys) +
srcImage.at<Vec3b>(xi, y11)[k] * (1 - xs) * ys +
srcImage.at<Vec3b>(x11, yi)[k] * xs*(1 - ys) +
srcImage.at<Vec3b>(x11, y11)[k] * xs * ys);
}
}

}

return resultImage;
}

 


Mat BilinearInterParallel(Mat &srcImage, double kx, double ky)
{
//获取输出图像的分辨率
int nRows = cvRound(srcImage.rows*kx);
int nCols = cvRound(srcImage.cols*ky);
int k;
Mat resultImage(nRows, nCols, srcImage.type());
#pragma omp parallel for private(k) num_threads(3)
for (k = 0; k < 3; k++)
{
cout << k << endl;
for (int i = 0; i < nRows; i++)
{
for (int j = 0; j < nCols; j++)
{
//获取目标图像(i,j)在原图中的坐标
double xm = i / kx;
double ym = j / ky;

//取出映射到原图的坐标的整数部分
int xi = (int)xm;
int yi = (int)ym;

//取出偏移量
double xs = xm - xi;//小数部分
double ys = ym - yi;

int x11 = xi + 1;//整数部分加1
int y11 = yi + 1;

//边缘点
if (x11 > (srcImage.rows - 1))
x11 = xi - 1;
if (y11 > (srcImage.cols - 1))
y11 = yi - 1;

// bgr
resultImage.at<Vec3b>(i, j)[k] = (int)(srcImage.at<Vec3b>(xi, yi)[k] * (1 - xs)*(1 - ys) +
srcImage.at<Vec3b>(xi, y11)[k] * (1 - xs) * ys +
srcImage.at<Vec3b>(x11, yi)[k] * xs*(1 - ys) +
srcImage.at<Vec3b>(x11, y11)[k] * xs * ys);
}
}

}

return resultImage;
}

posted @ 2020-07-28 16:54  瞬_冷  阅读(169)  评论(0)    收藏  举报