C ++中的图像模糊。矩阵副本的问题

时间:2010-07-21 00:24:56

标签: c++ image matrix

我正在输入黑/白像素值矩阵,然后我使用平均技术模糊内部。我有正确的循环程序,但我需要原始矩阵的常量副本,以便在单步执行时使用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

3 个答案:

答案 0 :(得分:2)

这一行:

image = matrix;

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

你想要的是:

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

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

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

注意:您需要#include <string.h>才能使用memcpy。

答案 1 :(得分:0)

  

“但我需要一份不变的副本   for循环的原始矩阵   单步执行“

是的!因此,请勿在模糊功能中修改输入('矩阵')。只修改输出('图像')。

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

因此,当您循环打印输出时,请使用“图像”而不是“矩阵”。如果你真的想把'image'复制成'matrix',就像Joey Adams所说的那样。

答案 2 :(得分:0)

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

使其更快的一种简单方法是首先仅水平模糊图像,然后垂直模糊中间结果。这将采用2 * matCol * matRow * k运算的顺序,并给出相同的结果(以避免舍入,在整个过程的中途不要除k - 保持中间像素总和

如果你想要一个有趣的谜题,有一种巧妙的方法可以做到这一点,大约需要同时,无论给定的k