C ++图像处理循环

时间:2016-12-16 20:09:05

标签: c++ for-loop image-processing

我在txt文件中有两个灰度图像,一个是主图像的较小块。我已经将图像读入两个不同的二维矢量矩阵。

图像的行和列是:

Main:M = 768 N = 1024

SubImg:R = 49℃= 36

int R = 49; int C = 36;     //Sub Image Rows / Columns
int M = 768; int N = 1024;  //Main Image Rows / Columns

我想通过宽度为49和高度:36的块来循环主图像,并将每个块放入一个数组中,这样我就可以将数组与Sub图像(使用最近邻搜索)进行比较,看看哪个块有与Sub图像最接近的结果。

我遇到的问题是我无法显示所有块的循环。当我运行循环时,只出现一定数量的块并且程序发生冲突。

// Testing Main 2D Vector in block format
for (int bx = 0; bx < M; bx += R)
    for (int by = 0; by < N; by += C) 
    {
        for (int x = 0; x < R; ++x)
        {
            for (int y = 0; y < C; ++y)
            {
                cout << MainIMG_2DVector[bx + x][by + y] << " ";
            }
        }
        cout << "\n\n" << endl;
    }

有人可以告诉我我做错了什么。

由于

EDIT ++++++++++++++++++++++++++++++++++++++++++++++

调试后

_DEBUG_ERROR("vector subscript out of range");
_SCL_SECURE_OUT_OF_RANGE;
<= M = 768不能被R = 49整除,最后一个循环以bx = 735(15 * 49)开始,并且应结束于bx = 735 + 48 = 783> 768 ......在N = 1024和C = 36乘以= 1008(28 * 36)至by = 1008 + 35 = 1043>的同样问题。 1024. - J. Piquard

如果我增加宽度和高度,我的主图像会拉长。有没有解决的办法?

1 个答案:

答案 0 :(得分:0)

可以探索两种方式:

方式1 - 将值R(和C)更改为M(和N)的最佳分隔符

int M = 768; int N = 1024;  //Main Image Rows / Columns
int R = 48; int C = 32;     //Sub Image Rows (768=16*48) / Columns (1024=32*32)

方式2 - 在for-loop退出条件中阻止out of range error

  

对于x,条件(x < R)((bx + x) < M))都应为   true

     

对于y,条件(y < C)((by + y) < N))都应如此   true

for (int x = 0; ((x < R)&&((bx + x) < M)); ++x)
{
    for (int y = 0; ((y < C)&&((by + y) < N)); ++y)
    {
        if ((bx + x)>=M) {
            std::cout << (bx + x) << (by + y) << " ";
        }
    }
}

而不是:

for (int x = 0; x < R; ++x)
{
    for (int y = 0; y < C; ++y)
    {
        if ((bx + x)>=M) {
            std::cout << (bx + x) << (by + y) << " ";
        }
    }
}