比较像素和排序

时间:2015-12-08 17:39:50

标签: c++ opencv

这是here的继续。

我的图像是800x800,可以分解为16个200x200的块。

我想比较它们之间的所有块,以便按顺序对它们进行排序(一个图像/块继续另一个)。

所以,我想比较一下块之间边界的像素。

由于我们有16个区块,因此它们被放置为4行×4个字符串。

例如,对于第一行,我们将有4个块,所以我将第一行与第二行进行比较。我将第一个块的最后一列与第二个块的第一列(它们的边界)进行比较,看它们是否匹配(如果一个图像是另一个图像的继续)。然后,我正在对它们进行排序。

因为我们有4x4维度,并且因为我正在排序(因此,我使用idx + 1代表下一个块而idx代表当前)我在每一行都应用了排序。

(现在,我只按行排序)

代码是:

    vector<Mat> smallImages;
    vector<Rect> smallImageRois;

    Mat big1(800, 800, CV_32F); //write the blocks to this big image
    int big1step = big1.step1();
    float* pbig1 = big1.ptr<float>(0);

    // scan all the rows ( used for sort )
    for ( int k = 0; k < blocks_width * blocks_height; k++ )//width=height=4
    {
        for (int idx = 0; idx < blocks_width * blocks_height; ++idx)
        {
            float* pdata = (float*)smallImages[idx].data;
            int step = smallImages[idx].step1();
            Rect roi = smallImageRois[idx];

            for (int i = 0; i < smallSize.height; ++i)//height is 200
            {
                for (int j = 0; j < smallSize.width; ++j)//width is 200
                { 
                    //load the subimages to every roi
                    pbig1[(roi.y + i) * big1step + (roi.x + j)] = smallImages[ idx ].at<int>(i*step+j);

                    //exclude indices 3,7,11,15 ( since we are already using idx + 1 ) in order to jump for every row
                    if ( idx != (blocks_width -1) && idx != (2 * blocks_width-1) && idx != (3 * blocks_width -1) 
                    && idx != blocks_width * blocks_height -1 )
                    {

                         //compare pixels at boundaries
                         // i am scaning for every row the first column (roi.x + 0 ) of the next image to the last column (roi.x + (subImageSize.width-1) of the previous
                         if ( abs( sqrt( pow( (pbig1+1)[(roi.y + i) * big1step + (roi.x + 0)] , 2 ) -  pow(  pbig1[(roi.y + i) * big1step + (roi.x + (subImageSize.width-1))] , 2 ) ) ) < 4 )
                            {

                                //do sort
                                int temp =  (pbig1+1)[(roi.y + i) * big1step + (roi.x + j)];
                                (pbig1+1)[(roi.y + i) * big1step + (roi.x + j)] = pbig1[(roi.y + i) * big1step + (roi.x + j)];
                                pbig1[(roi.y + i) * big1step + (roi.x + j)] = temp;

                            }
                       }

                }
            }
        }
    }

1)我收到与原始图像完全相同的图像。没有排序,没有比较!

2)我使用的是smallImages[ idx ].at<int>(i*step+j);而不是我在循环中声明的pdata,因为我无法理解为什么这两个会产生不同的结果:

smallImages[ 2 ].at<int>(i*step+j)
 (pdata+ 2)[ i * step + j ]  //doesn't this point to idx = 2?

0 个答案:

没有答案