std::vector<std::vector<Mat> > partitionImage(Mat&src,int rows,int cols)
函數中有三個輸入參數,第1個src是原圖像;第2個參數rows是網格的行數,第三個參數cols是網格的列數;返回的是二維矢量數組。
///*13. 圖像的二維分割,即將圖像分割成rows行、cols列的小格子—array[rows][cols], /// 保存在二維矢量vector中, std::vector<std::vector<Mat> > partitionImage(Mat&src,int rows,int cols) { std::vector<std::vector<Mat> > array(rows,std::vector<Mat>(cols)); int irows=src.rows,icols=src.cols;//原圖像的行數、列數 int dr=irows/rows,dc=icols/cols;//分割后的小塊圖像的行數、列數 //分割行、列數與圖像的行列數不能整除時,有效圖像偏移delt_x、delt_y。
/// 也就是將不能整除的余數像素丟棄,丟棄的方法就是,在圖像上、下、左右
/// 各刪除余數一半的像素。比如行余數為4,則在圖像頂部、底部分別刪除2行像素。
int delt_y=(irows%rows)/2,delt_x=(icols%cols)/2;
for(int i=0;i<rows;i++)
{ for(int j=0;j<cols;j++) { int x=j*dc+delt_x,y=i*dr+delt_y; array[i][j]=src(cv::Rect(x,y,dc,dr)); } } return array; }
測試主程序如下:
int main() { Mat img=imread("D:/CodeWork/MyImage/lena.jpg",0); vector<vector<Mat> > parts=partitionImage(img,3,4); imshow("parts 00",parts[0][3]); imshow("parts 01",parts[1][3]); imshow("parts 02",parts[2][3]); imshow("rogin img",img); waitKey(); return 0; }
輸出結果如下:
下面是分割后的圖像陣列: