Write a CC code to perform convolution on a 2D image in a pp
Solution
#include<iostream>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int reflect(int M, int x)
{
if(x < 0)
{
return -x - 1;
}
if(x >= M)
{
return 2*M - x - 1;
}
return x;
}
int circular(int M, int x)
{
if (x<0)
return x+M;
if(x >= M)
return x-M;
return x;
}
void noBorderProcessing(Mat src, Mat dst, float KernelData[][3])
{
float sum;
for(int y = 1; y < src.rows - 1; y++){
for(int x = 1; x < src.cols - 1; x++){
sum = 0.0;
for(int k = -1; k <= 1;k++){
for(int j = -1; j <=1; j++){
sum = sum + KernelData[j+1][k+1]*src.at<uchar>(y - j, x - k);
}
}
dst.at<uchar>(y,x) = sum;
}
}
}
void refletedIndexing(Mat src, Mat dst, float KernelData[][3])
{
float sum, x1, y1;
for(int y = 0; y < src.rows; y++){
for(int x = 0; x < src.cols; x++){
sum = 0.0;
for(int k = -1;k <= 1; k++){
for(int j = -1;j <= 1; j++ ){
x1 = reflect(src.cols, x - j);
y1 = reflect(src.rows, y - k);
sum = sum + KernelData[j+1][k+1]*src.at<uchar>(y1,x1);
}
}
dst.at<uchar>(y,x) = sum;
}
}
}
void performCircukarIndexing(Mat src, Mat dst, float KernelData[][3])
{
float sum, x1, y1;
for(int y = 0; y < src.rows; y++){
for(int x = 0; x < src.cols; x++){
sum = 0.0;
for(int k = -1;k <= 1; k++){
for(int j = -1;j <= 1; j++ ){
x1 = circular(src.cols, x - j);
y1 = circular(src.rows, y - k);
sum = sum + KernelData[j+1][k+1]*src.at<uchar>(y1,x1);
}
}
dst.at<uchar>(y,x) = sum;
}
}
}
int main(int argc, char* argv[])
{
if(argc != 3){
std::string filename(argv[1]);
int sigma = stoi(argv[0]);
Mat src, dst;
/// Loading image
src = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);
if( !src.data )
{ return -1; }
float KernelData[3][3] = {
{1/9.0, 1/9.0, 1/9.0},
{1/9.0, 1/9.0, 1/9.0},
{1/9.0, 1/9.0, 1/9.0}
};
dst = src.clone();
for(int y = 0; y < src.rows; y++)
for(int x = 0; x < src.cols; x++)
dst.at<uchar>(y,x) = 0.0;
performCircukarIndexing(src, dst, KernelData);
namedWindow(\"final\");
imshow(\"final\", dst);
namedWindow(\"initial\");
imshow(\"initial\", src);
waitKey();
}
return 0;
}


