关闭

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

标签: OpenCV图像剪切超出部分区域指定颜色填充颜色填充
416人阅读 评论(0) 收藏 举报
分类:

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


 

0
0
查看评论

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

Matlab图像剪切,超出图像区域指定颜色填充,Matlab自带图像剪切(裁剪)函数,即imcrop函数,但该函数对于超出图像边界区域是停止裁剪的,即对超出图像边界的部分不作裁剪处理。正常情况下,imcrop函数足够使用了。但有时,我们希望对于超出图像边界的区域,可以指定颜色填充,以便我们可以观察,...
  • guyuealian
  • guyuealian
  • 2017-08-23 16:58
  • 581

【OpenCV3】将图像指定区域使用另一图像(或ROI)覆盖

在图像处理中,有时会遇到使用使用一幅图像(或ROI)覆盖(替换)另一图像的指定区域,直接的方法是逐个像素进行复制,但这是一种效率很低的操作,下面介绍opencv中一种效率较高且简便的操作。
  • guduruyu
  • guduruyu
  • 2017-06-02 13:20
  • 2708

openCV学习笔记(9)-- 图像剪切

<br />图像的剪切有多种方法,其中一种是使用ROI的方法<br /> <br />第一步:将需要剪切的图像图像不部分设置为ROI<br />cvSetImageROI(src , cvRect(x,y,width,height));<...
  • superjimmy
  • superjimmy
  • 2011-03-01 19:11
  • 25455

【OpenCV】复制、切割出图像ROI区域

举例: #include #include using namespace cv; // 从一幅大图像中,取出一小块图像。 int main() { /* 读取大图像 */ IplImage *img1 = cvLoadImage("C:\\Users\\Liu\\Desktop\...
  • u010418035
  • u010418035
  • 2015-04-15 12:48
  • 2667

OpenCV:二值图像连通区域分析与标记算法实现

编译环境: 操作系统:Win8.1  64位 IDE平台:Visual Studio 2013 Ultimate OpenCV:2.4.8 一、连通域     在图像中,最小的单位是像素,每个像素周围有8个邻接像素,常见的邻接关系有2种:4邻接与8邻接。...
  • cooelf
  • cooelf
  • 2014-05-22 14:30
  • 10730

opencv图像感兴趣区域提取时超出范围怎么办

opencv感兴趣区域出界cvCopy报错的问题解决
  • u011826081
  • u011826081
  • 2016-05-04 20:30
  • 891

用OpenCV实现Photoshop算法(二): 图像剪切

二、图像剪切 用OpenCV 写一个图像剪切函数 imageCrop() 如下: //图像剪切 //参数:src为源图像, dst为结果图像, rect为剪切区域 //返回值:返回0表示成功,否则返回错误代码 int imageCrop(InputArray src, OutputArray ds...
  • c80486
  • c80486
  • 2016-09-11 02:26
  • 2855

opencv图像剪切,保存局部,图像抠取

转自http://blog.csdn.net/zbyzhlsp2/article/details/7478203 以下为原文内容: 自:http://exuws111.blog.sohu.com/179552814.html 图像的剪切有多种措施,其中一种是利用ROI的措施 ...
  • Nickter
  • Nickter
  • 2014-01-13 13:16
  • 1103

java版利用opencv根据RotateRect裁剪图像区域算法

public Mat guiyihuaMatByRoi(Mat cpsrcMat,RotatedRect rotatedRect){ /*Point[] rectPoints=new Point[4]; rotatedRect.points(rectPoints);/...
  • pretender05
  • pretender05
  • 2016-09-14 17:52
  • 2457

获取图像感兴趣地矩形区域实现

虽然在开发APP中,鼠标操作开发非常简单,它也属于用户接口设计,一直使用Misscoft Studio 中C/C++或.net来做,但是如果只需要简单的鼠标,键盘操作。而OpenCV并未直接提供库的函数进行鼠标操作。本节介绍使用OpenCV完成鼠标操作相关知识。鼠标操作主要理论有两点,第一是监控鼠标...
  • utimes
  • utimes
  • 2013-11-26 18:43
  • 4921
    个人资料
    • 访问:554321次
    • 积分:5894
    • 等级:
    • 排名:第5172名
    • 原创:106篇
    • 转载:51篇
    • 译文:1篇
    • 评论:174条
    博客专栏
    最新评论