首页 > 其他分享 >38.图像修复

38.图像修复

时间:2023-04-11 17:47:16浏览次数:30  
标签:38 修复 数据类型 像素 图像 CV 8U

  图像修复技术就是利用图像中损坏区域边缘的像素,根据像素值的大小以及像素间的结构关系,估计出损坏区域可能的像素排列,从而去除图像中受污染的区域。图像修复不仅可以去除图像中得“划痕”,还可以去除图像中得水印、日期等。OpenCV 4提供了能够对含有较少污染或者水印的图像进行修复的inpaint()函数,该函数的函数原型在代码清单8-26中给出。

代码清单8-26 inpaint()函数清单
void cv::inpaint(InputArray  src,
                 InputArray  inpaintMask,
                 OutputArray  dst,
                 double  inpaintRadius,
                 int  flags 
                 )
  • src:输入待修复图像,当图像为单通道时,数据类型可以是CV_8U、CV_16U或者CV_32F,当图像为三通道时数据类型必须是CV_8U。
  • inpaintMask:修复掩模,数据类型为CV_8U的单通道图像,与待修复图像具有相同的尺寸。
  • dst:修复后输出图像,与输入图像具有相同的大小和数据类型。
  • inpaintRadius:算法考虑的每个像素点的圆形邻域半径。
  • flags:修复方法标志,可以选择的参数及含义在表8-7给出

  该函数利用图像修复算法对图像中指定的区域进行修复,函数无法判定哪些区域需要修复,因此在使用过程中需要明确指出需要修复的区域。函数的第一个参数是需要修复的图像,该函数可以对灰度图像和彩色图像进行修复。修复灰度图像时,图像的数据类型可以为CV_8U、CV_16U或者CV_32F;修复彩色图像时,图像的数据类型只能为CV_8U。第二个参数是修复掩码,即指定图像中需要修复的区域,该参数输入量是一个与图像具有相同尺寸的数据类型为CV_8U的单通道图像,图像中非0像素表示需要修复的区域。函数的第三个 参数是修复后的输出图像,与输入图像具有相同的大小和数据类型。第四个参数表示修复算法考虑的每个像素点的圆形邻域半径。最后一个参数表示修复图像方法标志,可以选择的参数及含义在表8-7给出。该函数虽然可以对图像受污染区域进行修复,但是需要借助污染边缘区域的像素信息,离边缘区域越远的像素估计出的准确性越低,因此如果受污染区域较大,修复的效果就会降低。

代码清单8-27 myInpaint.cpp图像修复
#include <opencv2\opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat img1 = imread("inpaint1.png");
    Mat img2 = imread("inpaint2.png");
    if (img1.empty() || img2.empty())
    {
        cout << "请确认图像文件名称是否正确" << endl;
        return -1;
    }
    imshow("img1", img1);
    imshow("img2", img2);

    //转换为灰度图
    Mat img1Gray, img2Gray;
    cvtColor(img1, img1Gray, COLOR_RGB2GRAY, 0);
    cvtColor(img2, img2Gray, COLOR_RGB2GRAY, 0);

    //通过阈值处理生成Mask掩模
    Mat img1Mask, img2Mask;
    threshold(img1Gray, img1Mask, 245, 255, THRESH_BINARY);
    threshold(img2Gray, img2Mask, 245, 255, THRESH_BINARY);

    //对Mask膨胀处理,增加Mask面积
    Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
    dilate(img1Mask, img1Mask, Kernel);
    dilate(img2Mask, img2Mask, Kernel);

    //图像修复
    Mat img1Inpaint, img2Inpaint;
    inpaint(img1, img1Mask, img1Inpaint, 5, INPAINT_NS);
    inpaint(img2, img2Mask, img2Inpaint, 5, INPAINT_NS);

    //显示处理结果
    imshow("img1Mask", img1Mask);
    imshow("img1修复后", img1Inpaint);
    imshow("img2Mask", img2Mask);
    imshow("img2修复后", img2Inpaint);
    waitKey();
    return 0;
}

 

标签:38,修复,数据类型,像素,图像,CV,8U
From: https://www.cnblogs.com/okmai77xue/p/17307037.html

相关文章

  • 37.图像分割
    1、Grabcut图像分割代码清单8-21grabCut()函数原型voidcv::grabCut(InputArrayimg,InputOutputArraymask,Rectrect,InputOutputArraybgdModel,InputOutputArrayfgdModel,......
  • 提升工作效率的顶级AI工具:写作、图像、音视频、编程与效率
    ChatGPT风靡全球,人人可用!小红书上有关ChatGPT的笔记已有10w+篇,相关话题浏览量也达到了1.12亿次。其中讨论最为热烈的,要数“ChatGPT使用教程”。(当然,类似的话题还包括,教你如何使用Midjourney等等)甚至还有人通过ChatGPT教学,月入十万。在如今处处都追求降......
  • 35.图像矩的计算与应用
    矩是描述图像特征的算子,被广泛用于图像检索和识别、图像匹配、图像重建、图像压缩以及运动图像序列分析等领域。本节中将介绍几何矩与Hu矩的计算方法以及应用Hu矩实现图像轮廓的匹配。1、几何矩与中心矩 OpenCV4提供了计算图像矩的moments()函数,该函数的函数原型在代码清单7-......
  • 31、图像连通域分析
    图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来。提取图像中不同的连通域是图像处理中较为常用的方法,例如在车牌识别、文字识别、目标检测等领域对感兴趣区域分割与识别。一般情况下,一个......
  • 30.图像距离变换
    图像中两个像素之间的距离有多种定义方式,图像处理中常用的距离有欧式距离、街区距离和棋盘距离,本节中将重点介绍这三种距离的定义方式,以及如何利用两个像素间的距离来描述一幅图像。1、欧式距离,两个像素点之间的直线距离。与直角坐标系中两点之间的直线距离求取方式相同,分别......
  • 28.图像滤波
    1、均值滤波代码清单5-8blur()函数原型voidcv::blur(InputArraysrc,OutputArraydst,Sizeksize,Pointanchor=Point(-1,-1),intborderType=BORDER_DEFAULT)待......
  • 27、图像中加入噪声
    1、图像中加入椒盐噪声椒盐噪声又被称作脉冲噪声,它会随机改变图像中的像素值,是由相机成像、图像传输、解码处理等过程产生的黑白相间的亮暗点噪声,其样子就像在图像上随机的撒上一些盐粒和黑椒粒,因此被称为椒盐噪声。考虑到椒盐噪声会随机产生在图像中的任何一个位置,因此对于......
  • 25.图像直方图
    1、图像直方图绘制图像直方图是图像处理中非常重要的像素统计结果,图像直方图不再表征任何的图像纹理信息,而是对图像像素的统计。由于同一物体无论是旋转还是平移在图像中都具有相同的灰度值,因此直方图具有平移不变性、放缩不变性等优点,因此可以用来查看图像整体的变化形式,例......
  • 剑指offer38(Java)-字符串的排列(中等)
    题目:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例:输入:s="abc"输出:["abc","acb","bac","bca","cab","cba"] 限制:1<=s的长度<=8来源:力扣(LeetCode)链接:https://leetcode.cn/pr......
  • m基于shepp-Logan模型和滤波反投影的医学图像多尺度全局重建和局部重建matlab仿真
    1.算法描述        从投影重建物体的截面图像是图像处理中非常重要的技术此技术在物体的无损伤性检测其内部缺陷的应用中能起很大作用从投影重建图像的技术早在20世纪中期就已经制成常规医疗诊断设备的商品1917年奥地利数学家J.Radon发表的论文证明了二维物体或三维物体......