首页 > 其他分享 >opencv学习笔记七十一:图像修复

opencv学习笔记七十一:图像修复

时间:2023-02-18 10:06:52浏览次数:65  
标签:ROI 修复 int imshow 笔记 opencv imageMask 图像 七十一


当我们的照片有划痕或遭到人为的涂鸦(比如马赛克)时, 如果我们想让这些遭到破坏的图片尽可能恢复到原样,Opencv能帮我们做到吗?答案是肯定的。

那么图像修复技术的原理是什么呢?

简而言之,就是利用那些已经被破坏的区域的边缘, 即边缘的颜色和结构,根据这些图像留下的信息去推断被破坏的信息区的信息内容,然后对破坏区进行填补 ,以达到图像修补的目的。

OpenCV中就是利用inpaint()这个函数来实现修复功能的。

void inpaint( InputArray src, InputArray inpaintMask,
OutputArray dst, double inpaintRadius, int flags );
  • 第一个参数src,输入的单通道或三通道图像;
  • 第二个参数inpaintMask,图像的掩码,单通道图像,大小跟原图像一致,inpaintMask图像上除了需要修复的部分之外其他部分的像素值全部为0;
  • 第三个参数dst,输出的经过修复的图像;
  • 第四个参数inpaintRadius,修复算法取的邻域半径,用于计算当前像素点的差值;
  • 第五个参数flags,修复算法,有两种:INPAINT_NS 和I NPAINT_TELEA;
#include<opencv2\opencv.hpp>
using namespace cv;
int main()
{
imshow("原图", imageSource);
Mat imageGray;

//转换为灰度图
cvtColor(imageSource, imageGray, CV_RGB2GRAY, 0);
imshow("gray", imageGray);

//通过阈值处理生成Mask
Mat imageMask = Mat(imageSource.size(), CV_8UC1, Scalar::all(0));
imshow("imageMask", imageMask);
threshold(imageGray, imageMask, 240, 255, THRESH_BINARY);

//对Mask膨胀处理,增加Mask面积
Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(imageMask, imageMask, Kernel);

//图像修复
inpaint(imageSource, imageMask, imageSource, 5, INPAINT_TELEA);
imshow("Mask", imageMask);
imshow("修复后", imageSource);
waitKey();
}

下面是修复效果,效果看上去很不错,但仔细一看 ,还是有些细节跟原图发生了差异,比如刀和头上那个亮点,这是因为生成掩模的时候这些区域的亮度和白色的叉痕亮度相近,所以也成为了被修复的的对象。

opencv学习笔记七十一:图像修复_图像修复

想要消除这些瑕疵,可设置ROI区域,只对ROI区域的图像形成掩模和修复,其它区域不动。

//图像修复
#include<opencv2\opencv.hpp>
using namespace cv;
void callback(int event, int x, int y, int flags, void* userdata);
Point ptL, ptR;
Mat src, srcCopy,ROI,gray;
int main()
{
src = imread("6.jpg");
if (src.empty())
{
printf("could not load image!");
return -1;
}
namedWindow("input");
imshow("input", src);

setMouseCallback("input", callback);
waitKey();
}
void callback(int event, int x, int y, int flags, void* userdata)
{
if (event == CV_EVENT_LBUTTONDOWN)
{
ptL = Point(x, y);
ptR = Point(x, y);
}
if (flags == CV_EVENT_FLAG_LBUTTON)
{
ptR = Point(x, y);
srcCopy = src.clone();
rectangle(srcCopy, ptL, ptR, Scalar(255, 0, 0),2);
imshow("srcCopy", srcCopy);
}
if (event == CV_EVENT_LBUTTONUP)
{
if (ptL!= ptR)
{
ROI = src(Rect(ptL, ptR));
imshow("ROI", ROI);
}
}
if (event == CV_EVENT_RBUTTONDOWN)
{
//灰度化
cvtColor(ROI, gray, CV_BGR2GRAY);

//通过阈值处理生成Mask
Mat imageMask = Mat(ROI.size(), CV_8UC1, Scalar::all(0));
threshold(gray, imageMask, 240, 255, THRESH_BINARY);

//对Mask膨胀处理,增加Mask面积
Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(imageMask, imageMask, Kernel);
imshow("Mask", imageMask);

//图像修复
inpaint(ROI, imageMask, ROI, 5, INPAINT_TELEA);
imshow("修复后", src);
}
}

下面是修复效果,效果比上面好很多:

opencv学习笔记七十一:图像修复_图像修复_02

 

opencv学习笔记七十一:图像修复_图像修复_03

opencv学习笔记七十一:图像修复_图像修复_04


标签:ROI,修复,int,imshow,笔记,opencv,imageMask,图像,七十一
From: https://blog.51cto.com/u_14036511/6065049

相关文章

  • opencv四:鼠标事件
     查看所有鼠标事件:importcv2events=[iforiindir(cv2)if'EVENT'ini]print(events)运行结果:['EVENT_FLAG_ALTKEY','EVENT_FLAG_CTRLKEY','EVENT_FLAG_LBUTTON'......
  • opencv二:视频读取与保存
    1.打开摄像头#打开摄像头importcv2cap=cv2.VideoCapture(0)while(True):ret,frame=cap.read()#返回两个值,第一个为bool类型,如果读到帧返回True,如果没读到帧返回Fa......
  • opencv一:图像读取与保存
    如果不想每次在命令前加上cv2的话,可以将importcv2改为fromcv2import*图像读取函数:cv2.imread(图像路径,标志符)图像路劲可以是绝对路径和相对路径标识符有三种:cv2.IMREAD......
  • python学习笔记四:字典
    字典和集合一样是无序的,不能通过索引来存取,只能通过键来存取。字典的键必须是不可变的数据类型,如数字,字符串,元组等,列表等可变对象不能作为键。不允许同一个键出现两次,创建......
  • python学习笔记三:元组和集合
    学习python的小伙伴们经常会有这样一个疑问,既然有列表里,问什么还要有元组呢。因为列表是可变的,而元组是不可变的。比如我们经常需要传入函数的数据是不变的,这时就要用到元组......
  • python学习笔记二:列表
    列表通过索引读取数据:#索引读取数据a=[1,2,3]a[-1]运行结果:3列表支持嵌套:b=[[1,2,3],[4,5,6]]print(b)运行结果:[[1,2,3],[4,5,6]]列表可以修改:b=[[1,2,3],[4,5,6......
  • python学习笔记一:基本数据类型
    1、python的一切都是对象,对象是包含属性和方法的一个整体。2、数据类型的组成:身份(内存地址,通过id方法可看它的唯一标识符);类型(通过type方法查看);值(数据项)3、常用基本数据类型......
  • 新概念2册L33笔记(介词+空间)
    L33Outofthedarkness重点词汇explainv.explainsthtosb向某人解释explanationn.stormn.heavystorms暴风雨towardsprep.向、朝、(在空间/时间上接近)strug......
  • 读Java实战(第二版)笔记13_Java模块系统
    1. NicolaiParlog编写的TheJavaModuleSystem1.1. 推荐阅读2. Jigsaw项目2.1. 开发持续了将近十年3. 关注点分离3.1. separationofconcern,SoC3.2. 将......
  • 智能指针 shared_ptr weak_ptr shared_from_this 笔记
    图片来自std::enable_shared_from_this有什么意义?-孔洽孔洽的回答-知乎https://www.zhihu.com/question/30957800/answer/2700292012答案参考一下,应该不完全对当......