OpenCV C++案例,图像修复及制作九宫格

涛涛CV

共 4739字,需浏览 10分钟

 · 2022-06-17

关注涛涛CV,设置星标,更新错过




作者Zero___Chen

来源blog.csdn.net/Zero___Chen

本文将使用OpenCV C++ 对有瑕疵的图像进行修复。


OpenCV 提供了inpaint API可进行图像修复。


一、OpenCV inpaint

原图如图所示。本案例的需求是希望能够将图像上的红线给消除。OpenCV 提供的inpaint API能够实现这个效果。

void inpaint(InputArray src, 原图InputArray inpaintMask, 二进制掩模,指示要修复的像素OutputArray dst, 目标图像double inpaintRadius, 像素周围的邻域补绘。通常,如果要修复的区域很小,则使用较小的值仅产生较少模糊int flags INPAINT_NS 或 INPAINT_TELEA)


使用这个API最重要的就是生成一张二进制掩模图像(要修复的地方)。我们可以使用鼠标响应事件完成。

      //使用鼠标响应事件在 inpaintMask 绘制掩模,用于图片修复      if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON))      {            prevPt = Point(-1, -1);      }      else if (event == EVENT_LBUTTONDOWN)      {            prevPt = Point(x, y);      }      else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))      {            prevPt = Point(x, y);            //绘制掩模图像            circle(inpaintMask, prevPt, 2, Scalar::all(255), -1);            //imshow("inpaintMask", inpaintMask);                        //图像修复            Mat result;            inpaint(src, inpaintMask, result, 1, INPAINT_NS);            //imshow("image", result);      }


如图为掩模图像,接下来使用inpaint就可以对图像进行修复了。


二、源码

#include <iostream>#include<opencv2/opencv.hpp>#include<opencv2/photo.hpp>using namespace cv;using namespace std;
/*void inpaint( InputArray src, 原图 InputArray inpaintMask, 二进制掩模,指示要修复的像素 OutputArray dst, 目标图像 double inpaintRadius, 像素周围的邻域补绘。通常,如果要修复的区域很小,则使用较小的值仅产生较少模糊 int flags INPAINT_NS 或 INPAINT_TELEA )*/

Mat src, inpaintMask;Point prevPt(-1, -1);
static void onMouse(int event, int x, int y, int flags, void*){ //使用鼠标响应事件在 inpaintMask 绘制掩模,用于图片修复 if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON)) { prevPt = Point(-1, -1); } else if (event == EVENT_LBUTTONDOWN) { prevPt = Point(x, y); } else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)) { prevPt = Point(x, y);
//绘制掩模图像 circle(inpaintMask, prevPt, 2, Scalar::all(255), -1); //imshow("inpaintMask", inpaintMask);
//图像修复 Mat result; inpaint(src, inpaintMask, result, 1, INPAINT_NS); //imshow("image", result); }}

int main(){ src = imread("girl.jpg"); if (src.empty()) { cout << "No Image!" << endl; system("pause"); return -1; }
namedWindow("image", WINDOW_AUTOSIZE); imshow("image", src);
inpaintMask = Mat::zeros(src.size(), CV_8U); //二进制掩模,指示要修复的像素 setMouseCallback("image", onMouse, NULL);
waitKey(0); destroyAllWindows(); system("pause"); return 0; }

三、效果显示

如图为使用inpaint修复的效果,可以看出基本上将瑕疵都给去掉了。


总结

本文使用OpenCV C++进行图像修复,关键步骤有以下几点。

1、生成mask二进制掩模图像,用于修复图像。

2、inpaint API进行图像修复。




本文将使用OpenCV C++ 制作九宫格图像。

其实原理很简单,就是将一张图像均等分成九份。然后将这九个小块按一定间隔(九宫格效果)拷贝到新画布上就可以啦。


一、九宫格图像

原图如图所示。本案例的需求是希望将图像均等分成九份,制作九宫格图像。首先得将原图均等分成九份。

如图所示。将原图均等分成九份,然后将这每一个小方块按照一定的间隔(九宫格效果)拷贝到新图像就可以了。具体算法思想请看源码注释。


二、源码

#include<iostream>#include<opencv2/opencv.hpp>using namespace std;using namespace cv;
int main(){ Mat src = imread("test.jpg"); if (src.empty()) { cout << "No Image!" << endl; system("pause"); return -1; }
//原图宽高 int width = src.cols; int height = src.rows;
int num = 3;//小方块数量(可实现任意等份分割)
//制作九宫格每个小方块宽高 int step_x = width / num; int step_y = height / num;
//重新resize图片尺寸 resize(src, src, Size(step_x * num, step_y * num), 1, 1, INTER_LINEAR);
int space = 5; //空白间隔(实现九宫格效果)
Mat canvas = Mat(Size(src.cols + space * (num-1), src.rows + space * (num - 1)), CV_8UC3, Scalar(255,255,255)); //画布,用来制作九宫格图片
//就图片分成9个小块,将每一小块抠图至画布 for (int i = 0; i < num; i++) { for (int j = 0; j < num; j++) { //小方块相对于原图左上角起点 int x = j * step_x; int y = i * step_y; //将小方块抠图至画布。其中,每扣一小块需跳过space空白 src(Rect(x, y, step_x, step_y)).copyTo(canvas(Rect(x + space * j, y + space * i, step_x, step_y)));
//rectangle(src, Rect(x, y, step_x, step_y), Scalar(0, 255, 0), 2); } }
imshow("canvas", canvas); imshow("test", src); waitKey(0); system("pause"); return 0;}

三、效果显示

如图为生成的九宫格图像。


总结

本文使用OpenCV C++ 制作九宫格图像,关键步骤有以下几点。

1、将原图均等分成九个小方块

2、将小方块按一定的间隔(九宫格效果)拷贝到新画布上。



总结:

10年机器视觉网站,5年人工智能网站

2019经历总结2018视觉总结

项目感悟赚钱思路项目视频

课程:

《机器视觉:应用讲解》一总体概述二相机篇三镜头篇四光源篇五光学系统选型六视觉开发软件七相机标定技术八项目案例解析九视觉公司分析十产业发展情况

笔记:

《智能革命》《人工智能》《AI•未来》《好好赚钱》《韭菜的自我修养》读书笔记

行业: 

服务机器人公司,机器视觉公司,自动驾驶公司,ADAS公司总结, 防疫机器人发展腾讯未来交通

SLAM:

Vslam方案+源码,语义SLAM与深度相机SLAM和导航避障视觉SLAM总结

秦学英《三维物体的识别与跟踪》章国锋《视觉SLAM》申抒含《基于图像的三维建模》姜翰青《RGB -D SLAM》记录笔记

视觉SLAM的建图课件3课件2课件1

机器视觉:

毫米波雷达雷达视觉融合2021视觉研讨会2020上海研讨会双目和激光的三维重建2021视觉市场研究太阳能行业应用

机器视觉基本概念笔记,记录五,记录四,记录三,记录二,记录一

图像处理:

图像处理基本概念笔记,记录八,记录七,记录六 ,记录五,记录四 ,记录三,记录二 ,记录二,记录一

欢迎支持,点击在看,分享

浏览 73
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报