OpenCV C++案例,图像修复及制作九宫格
共 4739字,需浏览 10分钟
·
2022-06-17 18:42
关注涛涛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视觉市场研究,太阳能行业应用
机器视觉基本概念笔记,记录五,记录四,记录三,记录二,记录一
图像处理:
图像处理基本概念笔记,记录八,记录七,记录六 ,记录五,记录四 ,记录三,记录二 ,记录二,记录一
欢迎支持,点击在看,分享