JavaCV 图像修复-小学cvInpaint 算法

OpenCV 图像修复


小学cvInpaint 算法



一、效果
第一组 使用自动扫描修复的


第二组 使用模板(对应破坏图像)扫描修复的


图片从左至右依次123(如果三个图片不在一排,那么有个图片在下面是由于被挤压了。)

1.原图
2.被破坏的图片
3.被cvInpaint 修复过的图片

修复模板


不多说,上程序
---------------------------------------------------------------------------------
自动修复代码
/**
	 * 图像修复
	 * 使用自动扫描白色图像方式
	 * 
	 * @param imageSrc
	 * @return IplImage
	 */
	public IplImage inpaintingByBlank(IplImage imageSrc) {
		
		//修复范围
		double range = 50;
		
		//获取灰度
		IplImage grey = convertImageToGreyscale(imageSrc);
		
		//创建模板
		IplImage mark = cvCreateImage(cvGetSize(grey), IPL_DEPTH_8U, 1);
		
		//膨胀算法
		cvDilate(grey, mark, null, 2);
		
		//图像二值化-获得修复区域
		cvThreshold(mark, mark, 253, 255, CV_THRESH_BINARY);
		
		//目标图像		
		IplImage dist = cvCreateImage(cvGetSize(imageSrc), IPL_DEPTH_8U, 3);
		
		//修复
		cvInpaint(imageSrc, mark, dist, range, CV_INPAINT_TELEA );
		
		return dist;
	}


---------------------------------------------------------------------------------

---------------------------------------------------------------------------------
模板修复代码
/**
	 * 图像修复
	 * 使用指定模板的方式
	 * 
	 * @param imageSrc 图片源
	 * @param imageSrc 修复模板-需要修复的区域图
	 * @return IplImage
	 */
	public IplImage inpainting(IplImage imageSrc, IplImage mark) {
		
		//修复范围
		double range = 50;		
		
		//模板灰度化
		mark = convertImageToGreyscale(mark);
		
		//膨胀白色区域
		cvDilate(mark, mark, null, 2);
		
		//二值化
		cvThreshold(mark, mark, 253, 255, CV_THRESH_BINARY);
		
		//目标图像存储对象
		IplImage dist = cvCreateImage(cvGetSize(imageSrc), IPL_DEPTH_8U, 3);
		
		//进行修复
		cvInpaint(imageSrc, mark, dist, range, CV_INPAINT_TELEA );
		
		return dist;
	}


---------------------------------------------------------------------------------

1. 仔细比对自动扫描修复和模板修复的方式,区别很明显。自动扫描并没有模板修复精确,适合图像破坏得很复杂的环境。而精确修复可以定位只修复某一一个部分。

2. 所谓自动扫描,就是制定需要修复图像的颜色特征,通过二值化分离出来,通过膨胀的方式,让被修复的区域更加明显,这样就扫描出了被修复的区域。(具体的过滤方法,需要配合OpenCV其他的知识来实现,由于具体的分离方式不同,种类繁多,在此不做阐述。)

3. 所谓模板修复,就是使用指定的模板图像来进行修复,如果模板图像不是纯黑白,也需要对模板图像进行膨胀和二值化处理。

cvInpaint方法解说:

第一个参数:被处理的源图像
第二个参数:黑底色,白色被处理区域的模板图像
第三个参数:生成后的图像的存放对象,需要和源图像一样大小。
第四个参数:修复算法

 
 


由于本人开发使用的是JavaCV 0.7版本,提供的方法,并不是完全符合面向对象原则的,所以以后的版本可能会对方法进行修改。当然牛逼的人物一般会自己封装掉。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值