OpenCV图像剪切,超出图像区域指定颜色填充

OpenCV图像剪切,超出图像区域指定颜色填充

尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/77486096
   在OpenCV中实现图像裁剪和剪切是很简单的,但剪切时常常会出现超出边界的区域的情况,对于超出图像边界的区域,我们希望可以采用指定的颜色来填充。OpenCV3中提供了一个填充边界的函数cv::copyMakeBorder(对应opencv2中的cvCopyMakeBorder),利用这个函数,可以实现这个功能。下面实现一个Demo,对于超出剪切的区域,用红色填充。
   若想在Matlab中实现图像剪切,对超出图像区域指定颜色填充,可参考本人的博客http://blog.csdn.net/guyuealian/article/details/77507969
#include "stdafx.h"
#include <iostream>  
#include <opencv2\opencv.hpp>  
#include <opencv2\highgui\highgui.hpp>  
using namespace std;
using namespace cv;

cv::Mat im_crop1(cv::Mat srcImage, cv::Rect rect)
{
	cv::Mat destImage = cv::Mat::zeros(rect.height, rect.width, 0);// 目标图像  
								       // 获取可填充图像  
	int crop_x1 = cv::max(0, rect.x);
	int crop_y1 = cv::max(0, rect.y);
	int crop_x2 = cv::min(srcImage.cols - 1, rect.x + rect.width - 1); // 图像范围 0到cols-1, 0到rows-1  
	int crop_y2 = cv::min(srcImage.rows - 1, rect.y + rect.height - 1);

	cv::Mat roiImage = srcImage(cv::Range(crop_y1, crop_y2 + 1), cv::Range(crop_x1, crop_x2 + 1));// 左包含,右不包含  

																							// 如果需要填边  
	int left_x = (-rect.x);
	int top_y = (-rect.y);
	int right_x = rect.x + rect.width - srcImage.cols;
	int down_y = rect.y + rect.height - srcImage.rows;

	if (top_y > 0 || down_y > 0 || left_x > 0 || right_x > 0)//只要存在边界越界的情况,就需要边界填充
	{
		left_x = (left_x > 0 ? left_x : 0);
		right_x = (right_x > 0 ? right_x : 0);
		top_y = (top_y > 0 ? top_y : 0);
		down_y = (down_y > 0 ? down_y : 0);
		cv::copyMakeBorder(roiImage, destImage, top_y, down_y, left_x, right_x, cv::BORDER_CONSTANT, cv::Scalar(0,0,255));//cv::Scalar(0,0,255)指定颜色填充
		// 自带填充边界函数,top_y, down_y, left_x, right_x为非负正数  
		// 而且I.cols = roi_img.cols + left_x + right_x, I.rows = roi_img.rows + top_y + down_y  
	}
	else//若不存在边界越界的情况,则不需要填充了
	{
		destImage = roiImage;
	}
	return destImage;
}

cv::Mat im_crop2(cv::Mat img, cv::Rect rect)
{
	cv::Mat I = cv::Mat::zeros(rect.height, rect.width, 0);// 目标图像  

														   // 获取可填充图像  
	int crop_x1 = cv::max(0, rect.x);
	int crop_y1 = cv::max(0, rect.y);
	int crop_x2 = cv::min(img.cols - 1, rect.x + rect.width - 1); // 图像范围 0到cols-1, 0到rows-1  
	int crop_y2 = cv::min(img.rows - 1, rect.y + rect.height - 1);

	cv::Mat roi_img = img(cv::Range(crop_y1, crop_y2 + 1), cv::Range(crop_x1, crop_x2 + 1));// 左包含,右不包含  

																							// 截取图像在I中位置  
	int x1 = crop_x1 - rect.x;
	int y1 = crop_y1 - rect.y;
	int x2 = crop_x2 - rect.x;
	int y2 = crop_y2 - rect.y;

	I(cv::Range(y1, y2 + 1), cv::Range(x1, x2 + 1)) = I(cv::Range(y1, y2 + 1), cv::Range(x1, x2 + 1)) + roi_img;
	// 此处用加法,虽然I初始设置值全0,但是如果不用加法,直接“=”赋值,结果为0,不是想要的结果  
	return I;
}
int main(int argc)
{

	Mat src = imread("E:\\MatlabTest2\\images\\liuyifei.jpg");//原始图像是700*500
	cv::imshow("src", src);
	//cv::cvtColor(src, src, CV_RGB2GRAY);
	cv::Mat resize_img;
	cv::resize(src, resize_img, cv::Size(src.cols*0.5, src.rows*0.5), 0, 0, CV_INTER_LINEAR);// 缩小图像
	cv::imshow("resize_img", resize_img);
	cv::Rect rect(50, 50, 100, 100);
	// 裁剪图像,越界部分指定颜色填充
	// 函数im_crop1:使用与RGB和灰度图像
	// 函数im_crop2:使用与灰度图像
	cv::Mat crop_im1 = im_crop1(resize_img, rect);
	//cv::Mat crop_im = im_crop2(src1, rect);
	cv::imshow("crop_im1", crop_im1);
	cvWaitKey(0);
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI吃大瓜

尊重原创,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值