【第二部分 图像处理】第4章 Opencv图像处理高阶【3图像修复】

2024-08-30 13:32

本文主要是介绍【第二部分 图像处理】第4章 Opencv图像处理高阶【3图像修复】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3.1图像修复概述

在实际应用中,我们的图像常常会被噪声腐蚀,这些噪声或是镜头上的灰尘或水滴,或是旧照片的划痕,或者是图像遭到人为的涂画(比如马赛克)或者图像的部分本身已经损坏。如果我们想让这些受到破坏的额图片尽可能恢复到原样,Opencv能帮我们做到吗?
OpenCV真的有这个妙手回春的功能!别以为图像修补的工作只能用PS或者美图秀秀那些软件去做,其实由程序员自己写代码去做更加高效!
图像修复技术的原理是什么呢?简而言之,就是利用那些已经被破坏的区域的边缘, 即边缘的颜色和结构,根据这些图像留下的信息去推断被破坏的信息区的信息内容,然后对破坏区进行填补 ,以达到图像修补的目的。

3.2图像修复API:inpaint()函数

 inpaint()函数讲解

c++: void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags)

【参数】
第一个参数,src,输入的单通道或三通道图像;
第二个参数,inpaintMask,图像的掩码,单通道图像,大小跟原图像一致,inpaintMask图像上除了需要修复的部分之外其他部分的像素值全部为0;
第三个参数,dst,输出的经过修复的图像;
第四个参数,inpaintRadius,修复算法取的邻域半径,用于计算当前像素点的差值;
第五个参数,flags ,修复算法,有两种:INPAINT_NS 和I NPAINT_TELEA;
 INPAINT_NS Navier-Stokes based method.
 INPAINT_TELEA Method by Alexandru Telea [Telea04].
 inpaint()函数源代码

/*【inpaint()源代码】***************************************************************** @Version:OpenCV 3.0.0(Opnencv2和Opnencv3差别不大,Linux和PC的对应版本源码完全一样,均在对应的安装目录下)  * @源码路径:…\opencv\sources\modules\photo\src\inpaint.cpp* @起始行数:810行   
********************************************************************************/
void cv::inpaint( InputArray _src, InputArray _mask, OutputArray _dst,
                  double inpaintRange, int flags )
{
    Mat src = _src.getMat(), mask = _mask.getMat();
    _dst.create( src.size(), src.type() );
    CvMat c_src = src, c_mask = mask, c_dst = _dst.getMat();
    cvInpaint( &c_src, &c_mask, &c_dst, inpaintRange, flags );
}
可以看出inpaint源码中调用的是cvInpaint()函数,其源代码如下。
/*【inpaint()源代码】***************************************************************** @Version:OpenCV 3.0.0(Opnencv2和Opnencv3差别不大,Linux和PC的对应版本源码完全一样,均在对应的安装目录下)  * @源码路径:…\opencv\sources\modules\photo\src\inpaint.cpp* @起始行数:727行   
********************************************************************************/
Void cvInpaint( const CvArr* _input_img, const CvArr* _inpaint_mask, CvArr* _output_img,double inpaintRange, int flags )
{cv::Ptr<CvMat> mask, band, f, t, out;cv::Ptr<CvPriorityQueueFloat> Heap, Out;cv::Ptr<IplConvKernel> el_cross, el_range;CvMat input_hdr, mask_hdr, output_hdr;CvMat* input_img, *inpaint_mask, *output_img;int range=cvRound(inpaintRange);int erows, ecols;input_img = cvGetMat( _input_img, &input_hdr );inpaint_mask = cvGetMat( _inpaint_mask, &mask_hdr );output_img = cvGetMat( _output_img, &output_hdr );if( !CV_ARE_SIZES_EQ(input_img,output_img) || !CV_ARE_SIZES_EQ(input_img,inpaint_mask))CV_Error( CV_StsUnmatchedSizes, "All the input and output images must have the same size" );if( (CV_MAT_TYPE(input_img->type) != CV_8UC1 &&CV_MAT_TYPE(input_img->type) != CV_8UC3) ||!CV_ARE_TYPES_EQ(input_img,output_img) )CV_Error( CV_StsUnsupportedFormat,"Only 8-bit 1-channel and 3-channel input/output images are supported" );if( CV_MAT_TYPE(inpaint_mask->type) != CV_8UC1 )CV_Error( CV_StsUnsupportedFormat, "The mask must be 8-bit 1-channel image" );range = MAX(range,1);range = MIN(range,100);ecols = input_img->cols + 2;erows = input_img->rows + 2;f.reset(cvCreateMat(erows, ecols, CV_8UC1));t.reset(cvCreateMat(erows, ecols, CV_32FC1));band.reset(cvCreateMat(erows, ecols, CV_8UC1));mask.reset(cvCreateMat(erows, ecols, CV_8UC1));el_cross.reset(cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_CROSS,NULL));cvCopy( input_img, output_img );cvSet(mask,cvScalar(KNOWN,0,0,0));COPY_MASK_BORDER1_C1(inpaint_mask,mask,uchar);SET_BORDER1_C1(mask,uchar,0);cvSet(f,cvScalar(KNOWN,0,0,0));cvSet(t,cvScalar(1.0e6f,0,0,0));cvDilate(mask,band,el_cross,1);   // image with narrow bandHeap=cv::makePtr<CvPriorityQueueFloat>();if (!Heap->Init(band))return;cvSub(band,mask,band,NULL);SET_BORDER1_C1(band,uchar,0);if (!Heap->Add(band))return;cvSet(f,cvScalar(BAND,0,0,0),band);cvSet(f,cvScalar(INSIDE,0,0,0),mask);cvSet(t,cvScalar(0,0,0,0),band);if( flags == cv::INPAINT_TELEA ){out.reset(cvCreateMat(erows, ecols, CV_8UC1));el_range.reset(cvCreateStructuringElementEx(2*range+1,2*range+1,range,range,CV_SHAPE_RECT,NULL));cvDilate(mask,out,el_range,1);cvSub(out,mask,out,NULL);Out=cv::makePtr<CvPriorityQueueFloat>();if (!Out->Init(out))return;if (!Out->Add(band))return;cvSub(out,band,out,NULL);SET_BORDER1_C1(out,uchar,0);icvCalcFMM(out,t,Out,true);icvTeleaInpaintFMM(mask,t,output_img,range,Heap);}else if (flags == cv::INPAINT_NS) {icvNSInpaintFMM(mask,t,output_img,range,Heap);} else {CV_Error( cv::Error::StsBadArg, "The flags argument must be one of CV_INPAINT_TELEA or CV_INPAINT_NS" );}
}

3.3图像修复实例

 全区域阈值处理+Mask膨胀处理
代码参看附件【demo1】。

这里写图片描述

图1

由于是图像全区域做阈值处理获得的掩码,图像上部分区域也被当做掩码对待,导致部分图像受损。
 鼠标框选区域+阈值处理+Mask膨胀处理
代码参看附件【demo2】。
这里写图片描述

图2

可以看到,选定区域之外的图像不受修复影响,没有额外的损伤。
 鼠标划定整个区域作为修复对象
这个方法选定一个矩形区域,把整个矩形区域作为要修复的对象,该方法适用于图像结构比较简单,特别是纯色图像,并且选定区域面积占比不大的情况,效果较好。
代码参看附件【demo3】。
这里写图片描述

图3

 图像修复综合实例
代码参看附件【demo4】。
这里写图片描述

图4

本章参考附件

点击进入

这篇关于【第二部分 图像处理】第4章 Opencv图像处理高阶【3图像修复】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120958

相关文章

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

电脑提示msvcp90.dll缺少怎么办? MSVCP90.dll文件丢失的修复方法

《电脑提示msvcp90.dll缺少怎么办?MSVCP90.dll文件丢失的修复方法》今天我想和大家分享的主题是关于在使用软件时遇到的一个问题——msvcp90.dll丢失,相信很多老师在使用电脑时... 在计算机使用过程中,可能会遇到 MSVCP90.dll 丢失的问题。MSVCP90.dll 是 Mic

电脑报错cxcore100.dll丢失怎么办? 多种免费修复缺失的cxcore100.dll文件的技巧

《电脑报错cxcore100.dll丢失怎么办?多种免费修复缺失的cxcore100.dll文件的技巧》你是否也遇到过“由于找不到cxcore100.dll,无法继续执行代码,重新安装程序可能会解... 当电脑报错“cxcore100.dll未找到”时,这通常意味着系统无法找到或加载这编程个必要的动态链接库

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像