Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
逐像素模糊c图像-特殊情况_C_Image - Fatal编程技术网

逐像素模糊c图像-特殊情况

逐像素模糊c图像-特殊情况,c,image,C,Image,我正在开发一个程序,它会使c语言中的图像略微模糊 我知道我需要8个周围像素和选定像素的平均值和rgb值来更改该像素的颜色,所以我将它们相加并取平均值 我知道我正在实施的方式并不是最有效的方式,所以如果有任何关于如何简化的建议,请告诉我 我计划在末尾的第三个for循环中将tempimage复制回image 结构包含像素的rgb值 BYTE rgbtBlue; BYTE rgbtGreen; BYTE rgbtRed; 我现在的问题是处理特殊情况,例如图像的边缘或侧面

我正在开发一个程序,它会使c语言中的图像略微模糊

我知道我需要8个周围像素和选定像素的平均值和rgb值来更改该像素的颜色,所以我将它们相加并取平均值

我知道我正在实施的方式并不是最有效的方式,所以如果有任何关于如何简化的建议,请告诉我

我计划在末尾的第三个for循环中将
tempimage
复制回
image

结构包含像素的rgb值

    BYTE  rgbtBlue;
    BYTE  rgbtGreen;
    BYTE  rgbtRed;
我现在的问题是处理特殊情况,例如图像的边缘或侧面的像素

当所选像素没有被9个像素包围时,如何获取周围像素的值?

以下是我目前的代码:

void blur(int height, int width, RGBTRIPLE image[height][width])
{
    // copy all values to temporary image
    RGBTRIPLE tempimage[height][width];
    int avgRed = 0;
    int avgGreen = 0;
    int avgBlue = 0;
    //copy pixels to temp image
    for ( int x = 0; x < height; x++)
    {
        for (int y = 0; y < width; y++)
        {
            tempimage[x][y] = image[x][y];
        }
    }
    //get average of surrounding pixels
    for ( int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            //TODO: edge check
            //surrounding pixels
            avgRed = round(((float)(image[i][j].rgbtRed
            + image[i][j - 1].rgbtRed + image[i][j + 1].rgbtRed
            + image[i - 1][j].rgbtRed + image[i - 1][j - 1].rgbtRed
            + image[i - 1][j + 1].rgbtRed + image[i + 1][j].rgbtRed
            + image[i + 1][j - 1].rgbtRed + image[i + 1][j + 1].rgbtRed)) / 9);

            avgGreen = round(((float)(image[i][j].rgbtGreen
            + image[i][j - 1].rgbtGreen + image[i][j + 1].rgbtGreen
            + image[i - 1][j].rgbtGreen + image[i - 1][j - 1].rgbtGreen
            + image[i - 1][j + 1].rgbtGreen + image[i + 1][j].rgbtGreen
            + image[i + 1][j - 1].rgbtGreen + image[i + 1][j + 1].rgbtGreen)) / 9);

            avgBlue = round(((float)(image[i][j].rgbtBlue
            + image[i][j - 1].rgbtBlue + image[i][j + 1].rgbtBlue
            + image[i - 1][j].rgbtBlue + image[i - 1][j - 1].rgbtBlue
            + image[i - 1][j + 1].rgbtBlue + image[i + 1][j].rgbtBlue
            + image[i + 1][j - 1].rgbtBlue + image[i + 1][j + 1].rgbtBlue)) / 9);


            tempimage[i][j].rgbtRed = avgRed;
            tempimage[i][j].rgbtGreen = avgGreen;
            tempimage[i][j].rgbtBlue = avgBlue;

        }
    }

    //TODO: for loop to copy tempimage back to image here
    return;
}
void blur(int-height、int-width、rgb三重图像[height][width])
{
//将所有值复制到临时映像
RGB三倍频图像[高度][宽度];
int-avgRed=0;
int-avgGreen=0;
int-avgBlue=0;
//将像素复制到临时图像
对于(int x=0;x
在像您这样的算法中,有多种处理“边缘”情况的方法。下面的代码使用当前的“行”或“列”(而不是它的上/下或左/右),如果它位于相关边缘上:

for ( int i = 0; i < height; i++)
{
    // Edge check (A for 'above' index and B for 'below'):
    int A = i - 1; if (A < 0) A = 0;
    int B = i + 1; if (B > height - 1) B = height - 1;
    for (int j = 0; j < width; j++)
    {
        // Edge check (L = 'left of', R = 'right of'):
        int L = j - 1; if (L < 0) L = 0;
        int R = j + 1; if (R > width - 1) R = width - 1;
        // Then change all your 'i-1'|'i+i'|'j-i'|j+1' indexes to A|B|L|R:
        avgRed = round(((float)(image[i][j].rgbtRed
        + image[i][L].rgbtRed + image[i][R].rgbtRed
        + image[A][j].rgbtRed + image[A][L].rgbtRed
        + image[A][R].rgbtRed + image[B][j].rgbtRed
        + image[B][L].rgbtRed + image[B][R].rgbtRed)) / 9);
        // ... and similarly for green and blue ...
for(int i=0;iheight-1)B=height-1;
对于(int j=0;jwidth-1)R=width-1;
//然后将所有“i-1”|“i+i”|“j-i”| j+1”索引更改为A | B | L | R:
avgRed=圆形((浮动)(图像[i][j].rgbtRed
+图像[i][L].rgbtRed+图像[i][R].rgbtRed
+图像[A][j].rgbtRed+图像[A][L].rgbtRed
+图像[A][R].rgbtRed+图像[B][j].rgbtRed
+图像[B][L].rgbtRed+图像[B][R].rgbtRed))/9);
//…绿色和蓝色也是如此。。。

顺便说一句,我注意到您的像素索引是image[column][row](=列主顺序)。通常,
C
C++
2D数组的定义是相反的,即image[row][column](=行主顺序)但是,只要你确信这是你所拥有的,那么就没有问题了。

< P> C中的代码在考虑使用框模糊来模糊图像或N*N Matxx时效果良好。它考虑顶部、底部和中间行,并分别计算像素RGB。

// Blur image
void blur(int height, int width, RGBTRIPLE image[height][width])
{

    int sumBlue;
    int sumGreen;
    int sumRed;
    //create a temporary table
    RGBTRIPLE temp[height][width];

    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            sumBlue = 0;
            sumGreen = 0;
            sumRed = 0;
            //Top row
            if (i == 0)
            {
                if (j == 0) //top row left corner
                {
                    sumBlue = round(ceil(image[i][j].rgbtBlue
                                         + image[i][j + 1].rgbtBlue
                                         + image[i + 1][j].rgbtBlue
                                         + image[i + 1][j + 1].rgbtBlue) / 4);
                    sumGreen = round(ceil(image[i][j].rgbtGreen
                                          + image[i][j + 1].rgbtGreen
                                          +  image[i + 1][j].rgbtGreen
                                          +  image[i + 1][j + 1].rgbtGreen) / 4);
                    sumRed = round(ceil(image[i][j].rgbtRed
                                        + image[i][j + 1].rgbtRed
                                        + image[i + 1][j].rgbtRed
                                        + image[i + 1][j + 1].rgbtRed) / 4);

                }

                else if (j == width - 1) //top row right corner
                {
                    sumBlue = round(ceil(image[i][j].rgbtBlue
                                         + image[i][j - 1].rgbtBlue
                                         + image[i + 1][j].rgbtBlue
                                         + image[i + 1][j - 1].rgbtBlue) / 4);
                    sumGreen = round(ceil(image[i][j].rgbtGreen
                                          + image[i][j - 1].rgbtGreen
                                          + image[i + 1][j].rgbtGreen
                                          + image[i + 1][j - 1].rgbtGreen) / 4);
                    sumRed = round(ceil(image[i][j].rgbtRed
                                        + image[i][j - 1].rgbtRed
                                        + image[i + 1][j].rgbtRed
                                        + image[i + 1][j - 1].rgbtRed) / 4);
                }

                else //top row middle pixel
                {
                    sumBlue = round(ceil(image[i][j].rgbtBlue
                                         + image[i][j - 1].rgbtBlue
                                         + image[i][j + 1].rgbtBlue
                                         + image[i + 1][j].rgbtBlue
                                         + image[i + 1][j - 1].rgbtBlue
                                         + image[i + 1][j + 1].rgbtBlue) / 6);
                    sumGreen = round(ceil(image[i][j].rgbtGreen
                                          + image[i][j - 1].rgbtGreen
                                          + image[i][j + 1].rgbtGreen
                                          + image[i + 1][j].rgbtGreen
                                          + image[i + 1][j - 1].rgbtGreen
                                          + image[i + 1][j + 1].rgbtGreen) / 6);
                    sumRed = round(ceil(image[i][j].rgbtRed
                                        + image[i][j - 1].rgbtRed
                                        + image[i][j + 1].rgbtRed
                                        + image[i + 1][j].rgbtRed
                                        + image[i + 1][j - 1].rgbtRed
                                        + image[i + 1][j + 1].rgbtRed) / 6);
                }

            }
            //Bottom row of image
            else if (i == height - 1)
            {
                if (j == 0) //left side pixel of bottom row
                {
                    sumBlue = round(ceil(image[i][j].rgbtBlue
                                         + image[i][j + 1].rgbtBlue
                                         + image[i - 1][j].rgbtBlue
                                         + image[i - 1][j + 1].rgbtBlue) / 4);
                    sumGreen = round(ceil(image[i][j].rgbtGreen
                                          + image[i][j + 1].rgbtGreen
                                          + image[i - 1][j].rgbtGreen
                                          + image[i - 1][j + 1].rgbtGreen) / 4);
                    sumRed = round(ceil(image[i][j].rgbtRed
                                        + image[i][j + 1].rgbtRed
                                        + image[i - 1][j].rgbtRed
                                        + image[i - 1][j + 1].rgbtRed) / 4);
                }

                else if (j == width - 1) //right side pixel of last row
                {
                    sumBlue = round(ceil(image[i][j].rgbtBlue
                                         + image[i][j - 1].rgbtBlue
                                         + image[i - 1][j].rgbtBlue
                                         + image[i - 1][j - 1].rgbtBlue) / 4);
                    sumGreen = round(ceil(image[i][j].rgbtGreen
                                          + image[i][j - 1].rgbtGreen
                                          + image[i - 1][j].rgbtGreen
                                          + image[i - 1][j - 1].rgbtGreen) / 4);
                    sumRed = round(ceil(image[i][j].rgbtRed
                                        + image[i][j - 1].rgbtRed
                                        + image[i - 1][j].rgbtRed
                                        + image[i - 1][j - 1].rgbtRed) / 4);
                }

                else //middle pixels of last row
                {
                    sumBlue = round(ceil(image[i][j].rgbtBlue
                                         + image[i][j - 1].rgbtBlue
                                         + image[i][j + 1].rgbtBlue
                                         + image[i - 1][j].rgbtBlue
                                         + image[i - 1][j - 1].rgbtBlue
                                         + image[i - 1][j + 1].rgbtBlue) / 6);
                    sumGreen = round(ceil(image[i][j].rgbtGreen
                                          + image[i][j - 1].rgbtGreen
                                          + image[i][j + 1].rgbtGreen
                                          + image[i - 1][j].rgbtGreen
                                          + image[i - 1][j - 1].rgbtGreen
                                          + image[i - 1][j + 1].rgbtGreen) / 6);
                    sumRed = round(ceil(image[i][j].rgbtRed
                                        + image[i][j - 1].rgbtRed
                                        + image[i][j + 1].rgbtRed
                                        + image[i - 1][j].rgbtRed
                                        + image[i - 1][j - 1].rgbtRed
                                        + image[i - 1][j + 1].rgbtRed) / 6);
                }

            }

            else
            {
                if (j == 0) //left side of image
                {
                    sumBlue = round(ceil(image[i][j].rgbtBlue
                                         + image[i - 1][j].rgbtBlue
                                         + image[i + 1][j].rgbtBlue
                                         + image[i][j + 1].rgbtBlue
                                         + image[i - 1][j + 1].rgbtBlue
                                         + image[i + 1][j + 1].rgbtBlue) / 6); //6 pixels surrounding the left side of the image
                    sumGreen = round(ceil(image[i][j].rgbtGreen
                                          +  image[i - 1][j].rgbtGreen
                                          +  image[i + 1][j].rgbtGreen
                                          +  image[i][j + 1].rgbtGreen
                                          +  image[i - 1][j + 1].rgbtGreen
                                          +  image[i + 1][j + 1].rgbtGreen) / 6);
                    sumRed = round(ceil(image[i][j].rgbtRed
                                        +  image[i - 1][j].rgbtRed
                                        +  image[i + 1][j].rgbtRed
                                        +  image[i][j + 1].rgbtRed
                                        +  image[i - 1][j + 1].rgbtRed
                                        +  image[i + 1][j + 1].rgbtRed) / 6);
                }

                //Right side of image
                else if (j == width - 1)
                {
                    sumBlue = round(ceil(image[i][j].rgbtBlue
                                         + image[i - 1][j].rgbtBlue
                                         + image[i + 1][j].rgbtBlue
                                         + image[i][j - 1].rgbtBlue
                                         + image[i - 1][j - 1].rgbtBlue
                                         + image[i + 1][j - 1].rgbtBlue) / 6);
                    sumGreen = round(ceil(image[i][j].rgbtGreen
                                          +  image[i - 1][j].rgbtGreen
                                          +  image[i + 1][j].rgbtGreen
                                          +  image[i][j - 1].rgbtGreen
                                          +  image[i - 1][j - 1].rgbtGreen
                                          +  image[i + 1][j - 1].rgbtGreen) / 6);
                    sumRed = round(ceil(image[i][j].rgbtRed
                                        +  image[i - 1][j].rgbtRed
                                        +  image[i + 1][j].rgbtRed
                                        +  image[i][j - 1].rgbtRed
                                        +  image[i - 1][j - 1].rgbtRed
                                        +  image[i + 1][j - 1].rgbtRed) / 6);
                }

                else //middle pixels of middle rows
                {
                    //calculate for blue pixels
                    sumBlue = round(ceil(image[i - 1][j - 1].rgbtBlue
                                         + image[i - 1][j].rgbtBlue
                                         + image[i - 1][j + 1].rgbtBlue
                                         + image[i][j - 1].rgbtBlue
                                         + image[i][j].rgbtBlue
                                         + image[i][j + 1].rgbtBlue
                                         + image[i + 1][j - 1].rgbtBlue
                                         + image[i + 1][j].rgbtBlue
                                         + image[i + 1][j + 1].rgbtBlue) / 9);
                    //calculate for green pixels
                    sumGreen = round(ceil(image[i - 1][j - 1].rgbtGreen
                                          + image[i - 1][j].rgbtGreen
                                          + image[i - 1][j + 1].rgbtGreen
                                          + image[i][j - 1].rgbtGreen
                                          + image[i][j].rgbtGreen
                                          + image[i][j + 1].rgbtGreen
                                          + image[i + 1][j - 1].rgbtGreen
                                          + image[i + 1][j].rgbtGreen
                                          + image[i + 1][j + 1].rgbtGreen) / 9); // 9 pixels surrounding the middle one
                    //calculate for red pixels
                    sumRed = round(ceil(image[i - 1][j - 1].rgbtRed
                                        + image[i - 1][j].rgbtRed
                                        + image[i - 1][j + 1].rgbtRed
                                        + image[i][j - 1].rgbtRed
                                        + image[i][j].rgbtRed
                                        + image[i][j + 1].rgbtRed
                                        + image[i + 1][j - 1].rgbtRed
                                        + image[i + 1][j].rgbtRed
                                        + image[i + 1][j + 1].rgbtRed) / 9);
                }
            }

            //assign temp values with the calculated values
            temp[i][j].rgbtBlue = round((sumBlue));
            temp[i][j].rgbtGreen = round((sumGreen));
            temp[i][j].rgbtRed = round((sumRed));

        }
    }

    //copies values from temporary table and assigns to original image
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            //assiging temp value to original image
            image[j][i].rgbtBlue = temp[j][i].rgbtBlue;
            image[j][i].rgbtGreen = temp[j][i].rgbtGreen;
            image[j][i].rgbtRed = temp[j][i].rgbtRed;
        }
    }




}
//模糊图像
无效模糊(整数高度、整数宽度、RGB三重图像[高度][宽度])
{
内苏姆兰;
int sumGreen;
国际消费;
//创建一个临时表
RGB三脚架温度[高度][宽度];
对于(int i=0;i