图像分块
(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
ζั͡ޓއ genji - 至此只为原地流浪.......