OpenCV C++案例,图像修复及制作九宫格
关注涛涛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就可以对图像进行修复了。
二、源码
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++ 制作九宫格图像。
其实原理很简单,就是将一张图像均等分成九份。然后将这九个小块按一定间隔(九宫格效果)拷贝到新画布上就可以啦。
一、九宫格图像

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

如图所示。将原图均等分成九份,然后将这每一个小方块按照一定的间隔(九宫格效果)拷贝到新图像就可以了。具体算法思想请看源码注释。
二、源码
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、将小方块按一定的间隔(九宫格效果)拷贝到新画布上。
总结:
课程:
《机器视觉:应用讲解》,一总体概述,二相机篇,三镜头篇,四光源篇,五光学系统选型,六视觉开发软件,七相机标定技术,八项目案例解析,九视觉公司分析,十产业发展情况
笔记:
《智能革命》《人工智能》《AI•未来》《好好赚钱》《韭菜的自我修养》读书笔记
行业:
服务机器人公司,机器视觉公司,自动驾驶公司,ADAS公司总结, 防疫机器人发展,腾讯未来交通
SLAM:
Vslam方案+源码,语义SLAM与深度相机,SLAM和导航避障,视觉SLAM总结
秦学英《三维物体的识别与跟踪》,章国锋《视觉SLAM》,申抒含《基于图像的三维建模》,姜翰青《RGB -D SLAM》记录笔记
机器视觉:
毫米波雷达,雷达视觉融合,2021视觉研讨会,2020上海研讨会,双目和激光的三维重建,2021视觉市场研究,太阳能行业应用
机器视觉基本概念笔记,记录五,记录四,记录三,记录二,记录一
图像处理:
图像处理基本概念笔记,记录八,记录七,记录六 ,记录五,记录四 ,记录三,记录二 ,记录二,记录一
欢迎支持,点击在看,分享
