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

输出结果如下:

下面是分割后的图像阵列:

    

 

转载于:https://www.cnblogs.com/phoenixdsg/p/8418795.html

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值