C ++裁剪连续的2D数组

时间:2013-12-13 11:44:45

标签: c++ image-processing

假设我有一个名为image的数组,它是一个长的连续“size”元素数组 - 如下所定义。 我想裁剪这个数组(然后得到一个子矩阵)然后,通过修改子数组,我将自动修改源图像(参考)。

请注意,裁剪操作将返回非连续数组。这实际上是问题所在。

有没有办法在C ++中优雅地完成这项工作?

顺便说一句,通过使用OpenCV,boost等,我不感兴趣 ...

感谢您的帮助。

template <class Type> class Image
{
private:
    Type *image;

public:

    int rows;
    int cols;
    int size;

    Image(int rows, int cols): rows(rows), cols(cols)
    {
        image = new Type[size = rows*cols];
    }
    ~Image()
    {
        delete [] image;
    }
    Type & at(int i, int j)
    {
        return image[cols*i + j];
    }
    void print()
    {
        for(int i = 0; i < rows; ++i)
        {
                for(int j = 0; j < cols; ++j)
                    cout << at(i,j) << " ";
                cout << endl;
        }
        cout << endl;

    }

}; 

1 个答案:

答案 0 :(得分:3)

你可以创建一个CroppedImage类,它包含一个指向原始Image和偏移的引用或指针,并提供自己的方法,它们添加偏移然后调用原始图像方法:

template <class Type> class CroppedImage
{
    private: 
        Image<Type> *original;
        int offsetX;
        int offsetY;
    public:
        int rows;
        int cols;
        int size;
        CroppedImage(Image<Type> *orig, int offX, int offY, int width, int height)
        {
            original = orig;
            offsetX = offX;
            offsetY = offY;
            rows = height;
            cols = width;
            size = rows*cols;
        }
        ~CroppedImage(){}
        Type & at(int i, int j)
        {

            return original->at(i+offsetX, j+offsetY);
        }
        void print()
        {
            for(int i = 0; i < rows; ++i)
            {
                    for(int j = 0; j < cols; ++j)
                        cout << at(i,j) << " ";
                    cout << endl;
            }
            cout << endl;
        }

}

我没有测试过,可能会有一些拼写错误和其他错误。 如果您不想创建新类,可以将代码合并到Image类中。