【问题标题】:Image blurring in C++. Problem with copy of matrixC++ 中的图像模糊。矩阵副本问题
【发布时间】:2011-03-18 17:58:46
【问题描述】:

我正在输入一个黑/白像素值矩阵,然后我使用平均技术对内部进行模糊处理。我让程序正确循环,但我需要原始矩阵的恒定副本,以便在单步执行时使用 for 循环。我该怎么做?

#include<iostream>
using namespace std;

/****blurImage*****************************************************************************************************
 * main -- Program to blur a grayscale image given the pixel values and their location
 * 
 * Arguments: none
 * 
 * returns: 0
 *****************************************************************************************************************/

void blurImage(int matrix[100][100], int matRow, int matCol, int image[100][100]);

int main(){

    int matRow;
    int matCol;
    bool checkDataOk;
    int matrix[100][100];
    int image[100][100];

    cout << "Enter Image Width (in pixels):";
    cin >> matCol;

    cout << "Enter Image Height (in pixels):";
    cin >> matRow;

    if (matRow <=0 || matCol <=0 )
        checkDataOk = false;
    else checkDataOk = true;


    if(checkDataOk){

        cout << "Enter Pixel Values (left-->right):" << endl;
        int tmp;
        for (int i = 0; i < matRow; i++)
        {
            for (int j = 0 ; j < matCol; j++)
            {
                cin >> tmp;
                matrix[i][j] = tmp;
            }
        }

        blurImage(matrix, matRow, matCol, image);

        cout << endl;
        cout << "Output:" << endl;
        for(int i=0; i<matRow; i++){
            for(int j=0; j<matCol; j++){
                cout << matrix[i][j] << endl;
            }
        }
    }
    else cout << "Invalid Row/Column size";

    return 0;
}

void blurImage(int matrix[100][100], int matRow, int matCol, int image[100][100]){

    for(int i=1; i<(matRow-1); i++){        // start index at 1 and stop at -1 so we don't access outside the image
        for(int j=1; j<(matCol-1); j++){
            int total = 0;

            for(int n=(i-1); n<(i+2); n++){ // start at the top left corner of our current index and loop the 3x3 sub-matrix adding to the total
                for(int m=(j-1); m<(j+2); m++){
                    image = matrix;
                    total += image[n][m];
                }
            }

            int avg = total/9;              // get the average, and set the current index to the average
            matrix[i][j] = avg;
        }
    }

}

如果我输入这个 6x5 矩阵:

0   0   255 0   0
0   255 0   255 0
255 255 0   255 255
255 255 255 255 255
255 0   0   0   255
255 0   0   0   255
0   0   255 0   0

我应该得到:

0   0   255 0   0
0   113 141 113 0 
255 170 198 170 255 
255 170 141 170 255 
255 141 85  141 255 
255 0   0   0   255 
0   0   255 0   0

【问题讨论】:

  • 既然您使用的是 C++,有什么特别的原因您不使用向量而不是数组吗?如果您使用向量,那么 image=matrix 将完全按照您的意思执行(并且它会简化许多其他代码)。
  • 只需删除 image=matrix。修复边缘。

标签: c++ image matrix


【解决方案1】:

这只是与你的问题无关,但无论如何你最终都会遇到这个问题,所以我会提醒你。您执行过滤的方式大约需要matCol * matRow * k * k 操作,其中k 是模糊内核的宽度。虽然k=3 时这没问题,但很快就会变得太慢。

加快速度的一种简单方法是首先仅水平模糊图像,然后垂直模糊中间结果。这将采用2 * matCol * matRow * k 操作的顺序,并给出相同的结果(为避免舍入,不要在过程中途除以k - 保留中间像素sums

如果您想要一个有趣的谜题,有一种巧妙的方法可以做到这一点,这需要大约相同的时间,不管给定的k

【讨论】:

    【解决方案2】:

    "但我需要一个不变的副本 for 循环的原始矩阵 单步执行时使用"

    是的!所以不要在你的模糊函数中修改你的输入('矩阵')。只修改输出('image')。

    当 blurImage() 返回时,'matrix' 将不被修改,'image' 将包含结果。

    因此,当您循环打印输出时,请使用“图像”而不是“矩阵”。如果您真的想将“图像”复制到“矩阵”中,请按照 Joey Adams 的建议进行操作。

    【讨论】:

      【解决方案3】:

      这一行:

      image = matrix;
      

      实际上并不复制数组。如果我没记错的话,这是一个指针赋值(意味着image 现在将指向matrix),而不是数据副本。

      你想要的(我认为)是:

      memcpy(image, matrix, sizeof(image));
      

      由于图像和矩阵是相同类型的数组,我们可以做一个内存复制来传输内容。您也可以使用循环来执行复制,但这更简单、更快。

      另外,这个操作在四个嵌套循环中会非常慢,所以这可能不是你想要做的。

      注意:您需要 #include &lt;string.h&gt; 才能使用 memcpy。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多