- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
使用图像中选定区域的邻域来恢复该选定区域。
cv::inpaint 函数是 OpenCV 中用于图像修复(Inpainting)的一个重要函数。它可以根据指定的方法和参数来修复图像中被遮罩区域的内容,通常用于去除图像中的划痕、污点或其他不需要的标记。
函数原型
cpp
void cv::inpaint
(
InputArray src,
InputArray inpaintMask,
OutputArray dst,
double inpaintRadius,
int flags
)
参数
- 参数src 输入8位、16位无符号或32位浮点单通道图像,或者是8位三通道图像。
- 参数inpaintMask 修复掩码,8位单通道图像。非零像素表示需要进行修复的区域。
- 参数dst 输出图像,与src具有相同的大小和类型。
- 参数inpaintRadius 算法考虑的每个修复点的圆形邻域半径。
- 参数flags 可以是 cv::INPAINT_NS 或 cv::INPAINT_TELEA 的修复方法。
该函数通过边界附近的像素重建选定的图像区域。此功能可用于从扫描的照片中去除灰尘和划痕,或者从静态图像或视频中移除不需要的对象。更多详情请参见 http://en.wikipedia.org/wiki/Inpainting。
代码示例
cpp
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// 加载 OpenCV 自带的示例图像
Mat src = imread( String( "/media/dingxin/data/study/OpenCV/sources/images/lenna.png" ), IMREAD_COLOR ); // 确保 "lena.jpg" 存在于 OpenCV 的示例目录下
if ( src.empty() )
{
cout << "Could not open or find the image!" << endl;
return -1;
}
// 创建一个掩码图像,并在其上绘制需要修复的区域
Mat inpaintMask = Mat::zeros( src.size(), CV_8UC1 );
rectangle( inpaintMask, Point( 231, 83 ), Point( 331, 172 ), Scalar( 255, 255, 255 ), FILLED ); // 示例矩形
Mat dst;
// 使用 INPAINT_TELEA 方法进行图像修复
inpaint( src, inpaintMask, dst, 3, INPAINT_TELEA );
// 显示原图、掩码和修复后的图像
imshow( "Original Image", src );
imshow( "Inpaint Mask", inpaintMask );
imshow( "Inpainted Image", dst );
waitKey( 0 );
return 0;
}
运行结果

处理的不大理想,有待于进一步研究使用方法。