OpenCV切割图像与合并图像

首先是图像的分割

Mat spliteTest(Mat image)

{
    long cols = image.cols;
    long rows = image.rows;
    Mat nullImage(Size(cols/2, rows), CV_LOAD_IMAGE_GRAYSCALE);  //取一半列数的大小
    Mat subImage = image(Range::all(), Range(0,cols/2));   //将需要的图像读取出来
    subImage.copyTo(nullImage(Rect(0, 0, cols/2, rows)));   //复制进指定的Mat里
    return nullImage;
}


int main()
{
    Mat image = imread("Red.bmp", CV_LOAD_IMAGE_GRAYSCALE);  

    Mat nullImage = spliteTest(image);

    imshow("nullImage", nullImage);  //分割后的图像

    imshow("redImage", image);   //分割前的图像

}

其次是图像的合并

Mat spliteImageAndCon(Mat image)

{
    long cols = image.cols;
    long rows = image.rows;
    Mat nullImage(Size(cols, rows), CV_LOAD_IMAGE_GRAYSCALE);
    long con_cols = 0;
    long con_rows = 0;
    long cols_div = cols / width;
    long cols_remain = cols % width;
    for (long i = 0; i <cols_div; i++)
    {
    //取全部行,
    Mat subImage = image(Range::all(), Range(i*width, (i + 1)*width)); //确定目标块的位置
    subImage.copyTo(nullImage(Rect(i*width, 0, width, rows)));  //确定合并的位置
    }
    Mat subImage = image(Range::all(), Range(cols_div*width, cols_div*width +  cols_remain)); //合并剩下的部分即可
    subImage.copyTo(nullImage(Rect(cols_div*width, 0, cols_remain, rows)));
    return nullImage;

}

下面附上全部的测试代码:

#include<stdio.h>
#include<cuda_runtime.h>
#include<device_launch_parameters.h>
#include <iostream>
#include <opencv/highgui.h>
#include <string>
#include <math.h>




using namespace std;
using namespace cv;
const int width = 200; //从左往右多少列


Mat spliteImageAndCon(Mat image)
{
    long cols = image.cols;
    long rows = image.rows;
    Mat nullImage(Size(cols, rows), CV_LOAD_IMAGE_GRAYSCALE);
    long con_cols = 0;
    long con_rows = 0;
    long cols_div = cols / width;
    long cols_remain = cols % width;
    for (long i = 0; i <cols_div; i++)
    {
    //取全部行,
    Mat subImage = image(Range::all(), Range(i*width, (i + 1)*width));
    subImage.copyTo(nullImage(Rect(i*width, 0, width, rows)));
    }
    Mat subImage = image(Range::all(), Range(cols_div*width, cols_div*width + cols_remain));
    subImage.copyTo(nullImage(Rect(cols_div*width, 0, cols_remain, rows)));
    return nullImage;
}


Mat spliteTest(Mat image)
{
    long cols = image.cols;
    long rows = image.rows;
    Mat nullImage(Size(cols/2, rows), CV_LOAD_IMAGE_GRAYSCALE);  //取一半列数的大小
    Mat subImage = image(Range::all(), Range(0,cols/2));
    subImage.copyTo(nullImage(Rect(0, 0, cols/2, rows)));
    return nullImage;
}


int main()
{


    Mat image = imread("Red.bmp", CV_LOAD_IMAGE_GRAYSCALE);

    //Mat nullImage = spliteImageAndCon(image);
    Mat nullImage = spliteTest(image);

    imshow("nullImage", nullImage);
    imshow("redImage", image);


    waitKey(0);
    return 0;
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值