这是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?