OpenCV计算摄影学(1)图像修复(Inpainting)的函数inpaint()

news/2025/2/25 7:00:49
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

使用图像中选定区域的邻域来恢复该选定区域。
cv::inpaint 函数是 OpenCV 中用于图像修复(Inpainting)的一个重要函数。它可以根据指定的方法和参数来修复图像中被遮罩区域的内容,通常用于去除图像中的划痕、污点或其他不需要的标记。

函数原型

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。

代码示例

#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;
}

运行结果

在这里插入图片描述
处理的不大理想,有待于进一步研究使用方法。


http://www.niftyadmin.cn/n/5865128.html

相关文章

Kafka面试题----Kafka是如何保证顺序消费的

在 Kafka 中&#xff0c;默认情况下消息是按分区进行顺序存储和读取的&#xff0c;但全局顺序消费&#xff08;即所有分区的消息按顺序消费&#xff09;较难实现。下面分别介绍 Kafka 按分区顺序消费以及实现全局顺序消费的相关内容。 按分区顺序消费 Kafka 本身可以保证单个…

机器人“战场”:创新、落地与未来

从1999年的机器管家&#xff0c;2001年的机器人小孩大卫&#xff0c;到2015年拥有自我意识的“查派”&#xff0c;在科幻电影里&#xff0c;人们赋予了对机器人的各种形象和想象。2018年&#xff0c;尽管只是实验室的试验品&#xff0c;但波士顿动力机器狗Spot的视频还是在国内…

python 判断 字符串在字典列表中

在Python中&#xff0c;如果你想判断一个字符串是否存在于一个字典列表中&#xff0c;你可以通过遍历这个列表并检查每个字典是否包含你想要找的字符串键来实现。这里有几种方法可以做到这一点&#xff1a; 方法1&#xff1a;使用any()函数 你可以使用any()函数和字典的get方法…

【MySQL】第九弹---掌握SQL关键操作:更新、删除、插入与聚合分析的秘诀

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】 目录 1 Update 2 Delete 2.1 删除数据 2.2 截断表 3 插入查询结果 4 聚合函数 5 group by子句的使用 1 Update 语法…

【AI+智造】DeepSeek价值重构:当采购与物控遇上数字化转型的化学反应

作者&#xff1a;Odoo技术开发/资深信息化负责人 日期&#xff1a;2025年2月24日 引言&#xff1a;从事企业信息化工作16年&#xff0c;我见证过无数企业从手工台账到ERP系统的跨越。但真正让采购和物控部门脱胎换骨的&#xff0c;是融合了Deepseek AI的Odoo数字化解决方案——…

如何在 CMake 上设置新项目以获得成功

选择正确的构建系统可以决定项目的成功与否。从处理依赖项到确保正确编译和链接代码&#xff0c;正确的构建系统可以节省 你时间并避免潜在的麻烦。 在众多可用选项中&#xff0c;CMake 构建系统脱颖而出&#xff0c;可以处理复杂的跨平台项目。 本教程介绍了 CMake 的受欢迎…

【C】堆的应用1 -- 堆排序

之前学习了堆&#xff0c;堆的一棵以顺序结构存储的完全二叉树&#xff0c;堆本身又氛围大根堆和小根堆&#xff0c;假设以大根堆为例&#xff0c;由于堆顶部元素是一棵二叉树里面最大的元素&#xff0c;所以如果每次都取堆顶的元素&#xff0c;那么取出的元素就是一个降序排列…

量子计算的数学基础:复数、矩阵和线性代数

量子计算是基于量子力学原理的一种新型计算模式,它与经典计算机在信息处理的方式上有着根本性的区别。在量子计算中,信息的最小单位是量子比特(qubit),而不是传统计算中的比特。量子比特的状态是通过量子力学中的数学工具来描述的,因此,理解量子计算的数学基础对于深入学…