Code: Select all
//For 4 loops
void convolutionColor(Mat src, Mat dst, Mat kernel)
{
float sum1, sum2, sum3;
int x = kernel.rows/2, y = kernel.cols/2;
for(int i = x; i < src.rows-x; i++)
{
for(int j = y; j < src.cols-y; j++)
{
sum1 = 0, sum2 = 0, sum3 = 0;
for(int k = -x; k <= x; k++)
{
for(int l = -y; l <= y; l++)
{
sum1 += kernel.at<float>(k+x,l+y) * src.at<Vec3b>(i-k, j-l)[0];
sum2 += kernel.at<float>(k+x,l+y) * src.at<Vec3b>(i-k, j-l)[1];
sum3 += kernel.at<float>(k+x,l+y) * src.at<Vec3b>(i-k, j-l)[2];
}
}
dst.at<Vec3b>(i,j)[0] = fabs(sum1);
dst.at<Vec3b>(i,j)[1] = fabs(sum2);
dst.at<Vec3b>(i,j)[2] = fabs(sum3);
}
}
}
//Convolution Other methods
void convolutionFast(Mat src, Mat dst, Mat kernel)
{
int x = kernel.rows/2;
float sum = 0;
Mat padded;
copyMakeBorder(src, padded, x,x,x,x,BORDER_CONSTANT, 0);
//imshow("Padded", padded);
for(int i = 0; i < kernel.rows; i++)
{
for(int j = 0; j < kernel.cols; j++)
{
sum += kernel.at<float>(i,j);
Mat roi(padded, Rect(i, j, src.rows, src.cols));
Mat roi_copy = roi.clone();
roi_copy = roi_copy.mul((double)kernel.at<float>(i,j));
dst += roi_copy;
}
}
if(sum)
dst *= 1/sum;
//dst *= 1.0/(kernel.cols * kernel.rows);
}
int main()
{
double t = (double)getTickCount();
Mat image = imread("lena.jpg", 1);
Mat conv(image.rows, image.cols, CV_8U, Scalar(0));
Mat conv1(image.rows, image.cols, CV_8UC3, Scalar(0,0,0));
Mat conv2(image.rows, image.cols, CV_8UC3, Scalar(0,0,0));
Mat conv3(image.rows, image.cols, CV_8UC3, Scalar(0,0,0));
Mat kernel(5,5, CV_32F, 1/25.0);
Mat kernel2 = (Mat_<float>(3,3) << 0,-1,0,
-1,4,-1,
0,-1,0);
//convolutionColor(image, conv, kernel);
imshow("Original", image);
convolutionFast(image, conv1, kernel);
convolutionColor(image, conv2, kernel);
filter2D(image, conv3,-1, kernel);
imshow("opencv", conv3);
imshow("ConvoFast", conv1);
imshow("ConvoNorm", conv2);
t = ((double)getTickCount() - t) / getTickFrequency();
cout << "Time: " << t << endl;
waitKey();
return 0;
}