0

这是一个代码:

#include<stdio.h>
#include<math.h>

float conv2D(int rowsKernel, int colsKernel, int rowsImage, int colsImage, float kernel[][5], int image[][15], float imageConvolved[][11]); //Function Prototype definition

float conv2D(int rowsKernel, int colsKernel, int rowsImage, int colsImage, float kernel[][5], int image[][15], float imageConvolved[][11])
{
    int kernelSize;     //This variable represents the size of the Gaussian kernel
    int i;          //variable which controls the rows of an image
    int j;          //variable which controls the columns of an image
    int ii;         //variable which controls the rows of the kernel
    int jj;         //variable which controls the columns of the kernel
    float sum;          //variable that holds the result of convolution for a particular pixel of an image
//float imageConvolved;//Result of an image convolved by a Gaussian kernel
    int imagePixel;
    float kernelPixel;
    kernelSize = colsKernel;    /*Since we consider a square kernel, then rowsKernel=colsKernel, which implies that the size of the                 kernel (kernelSize) equals either of these two variables (that is, kernelSize=colsKernel=rowsKernel) */
    for (i = kernelSize / 2; i < rowsImage - kernelSize / 2; i++)   // perform iteration through the rows of an image
    {
    for (j = kernelSize / 2; j < colsImage - kernelSize / 2; j++)   // perform iteration through the columns of an image
    {
        sum = 0;        /*Initializing the accumulator. This variable will finally contain the convolution result for a particular pixel */
        for (ii = -kernelSize / 2; ii <= kernelSize / 2; ii++)  // perform iteration through the rows of a kernel
        {
        for (jj = -kernelSize / 2; jj <= kernelSize / 2; jj++)  //perform iteration through the columns of a kernel
        {
            imagePixel = image[i + ii][j + jj];
            kernelPixel = kernel[ii + kernelSize / 2][jj + kernelSize / 2];

            sum += imagePixel * kernelPixel;
        }
        }
        imageConvolved[i - kernelSize / 2][j - kernelSize / 2] = sum;
    }
    }
    return (imageConvolved);    // convolved image
}

int main()
{
    float gauss[][5] = {
    {1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1}
    };
    int img[][15] = {
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
    };
    int rowsK = 5, colsK = 5, rowsI = 15, colsI = 15;
    float result[11][11];
    float Iconv[11][11];
    Iconv = conv2D(rowsK, colsK, rowsI, colsI, gauss, img, result);
    return 0;
}

我修改了代码以尝试解决问题。但是,我遇到了两个错误(使用 CCStudio V3.3):

“convolution.c”,第 39 行:错误:返回值类型与函数类型不匹配 “convolution.c”,第 71 行:错误:表达式必须是可修改的左值

4

2 回答 2

0

您正在从根据其声明imageConvolved返回的函数返回看似二维数组( )。float我不知道你从函数返回的意思,但似乎错误在这一行:

return(imageConvolved);
于 2013-09-30T07:50:17.627 回答
0

函数原型conv2D是float。但是,在您返回的定义中imageConvolvedimageConvolved是你的数组ormal parameter,你不需要返回它,所以你会返回一些floatinsead 类型的东西。

于 2013-09-30T10:28:56.027 回答