图像分块

  

(Xor,Yor)会归属于某一块。分块时,每一块的初始地址(左上角坐标)可以确定。

便捷起见,先确定出块的序号,分两个维度统计。

块序号:

block_numx=ceil(Xor+1)/16

block_numy=ceil(yOr+1)/16

每块的初始地址为:16(n-1)。边长可以随便定,将16换就可以了。

代码不对:

    int xo=0,yo=0;
    for (int y=yo;y<ceil(dbZoom*iHeight);y++)
    {    
        for (int x=xo;x<ceil(dbZoom*iWidth);x++)
        {int newWidth=ceil(dbZoom*iWidth);
            for(int i=1;i<=floor((iHeight+0.1)/16)-1;i++)
            {    
                if((xOr-1>=0+16*(i-1) && xOr<=16*i && yOr-1>=0+16*(i-1) && yOr<=16*i))                
                {
                    pbTag[y*newWidth+x]=255-20*i;
                }    
            }            
        }
  }

 代码好像对:

                    int newWidth=ceil(dbZoom*iWidth);
                    int block_numx=ceil((xOr+1.0)/16);
                    int block_numy=ceil((yOr+1.0)/16);
                    double blockSrc[256]={0};
                    int newcount=0;
                    //int k=0,l=0;
                    //分块存储进数组blockSrc[]中
                    for(int k=0;k<16;k++)
                    {
                        for(int l=0;l<16;l++)
                        {
                            int oldcount=(16*block_numy-16+k)*iWidth+16*block_numx-16+l;                
                            blockSrc[newcount]=pbSrc[oldcount];                        
                            newcount++;
                        }                        
                    }//分块存入完毕

OPENCV,别人的分成4×4块的c++代码:

int main()
{
    char* imgPath = "..\\img2.jpg";
 
     //[1] 获取图片数据,并转化成灰度图
    Mat img = imread(imgPath);
    if (NULL == img.data)
    {
        printf("read img error!\n");
        exit(1);
    }
    Mat imgGray;
    cvtColor(img, imgGray, CV_BGR2GRAY);
    // [2] 获取图像相关信息
    int nHeight = imgGray.rows;
    int nWidth = imgGray.cols;
    unsigned char* pData = imgGray.data;
    // [3] 将图像分成4*4块
    int p = 0, q = 0;   //用来标识块索引
    for (int ss = 0; ss < 16; ss++)
    {
        p = ss / 4; //行索引
        q = ss % 4; //列索引
        for (int i = nHeight*p / 4; i < nHeight*(p + 1) / 4; i++)
        {
            for (int j = nWidth*q / 4; j < nWidth*(q + 1) / 4;j++)
            {
                pData[i*nWidth + j] = ss * 255 / 16;  //每一块显示一种颜色,用于可视化验证
            }
        }    
    }
    //[4] 显示图像
    namedWindow("img");
    imshow("img", imgGray);
    waitKey(0);
    return 0;
}

 

分块读写策略:

一般而言图像文件在磁盘上是按行存贮的,就是从第一行到最后一行的

将数据读取/写入到某一块时,首先是从块的起始地址开始,将块的第一行的数据读取/写入。

但是,块的第二行数据和第一行数据地址不是连续的

 

【转载自】

将图像进行分块(笔记) - CSDN博客 https://blog.csdn.net/a200800170331/article/details/54667188

略论图像的分块读写策略 - CSDN博客 https://blog.csdn.net/clever101/article/details/2651139

【其他】

[python + opencv] 图像的旋转和分块 - CSDN博客 https://blog.csdn.net/Foolishwolf_x/article/details/39343011

 

posted @ 2018-09-06 22:01  ostartech  阅读(3411)  评论(0编辑  收藏  举报