在Opencv中將一幅圖像均分成M* N個小圖像



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;
}

輸出結果如下:

下面是分割后的圖像陣列:

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM