图像算法原理与实践——图像修复之 全变分模型

article/2025/10/15 15:17:02

在图像算法的高层次处理中,有一类很典型的应用,就是图像修复算法。图像在采集、传输、预处理过程中,都可能会发生图像数据被修改、损失和缺失等问题(例如:部分图像内容被污染、雾霾等),另外,在实际室外拍照的时候,可能会将用户不想需要的对象(例如:路人甲等)也摄入照片影像中,需要将这多余图像内容去除。这一类的图像处理算法可以统称为 图像修复,对污染后的图像进行去噪、修补、变换等操作还原原始图像内容。在图像修复中最主要的一类处理就是 图像修补,就是将图像中一小块被污染的区域通过各种算法尽量还原成原始图像。

如果图像中需要修复的区域都比较小,一个常见的算法就是将需要修复区域的邻边像素进行扩散,填补需要修复的区域,从而达到图像修补的目的。

一、图像修补基本概念

在一幅需要修复的图像中,我们将整幅图像用F表示,需要修复的区域块称之为靶区域,用符号D来表示,保留原始图像信息的区域(F-D)称之为 源区域

例如:在如下图像中,有一块被红色污损的区域,这里我们将红色区域称之为 靶区域,除了红色区域以外的图像区域,称之为 源区域。而我们的传统图像修复算法,就是利用 靶区域 附近的 源像素数据,经过变换拟合来逐渐填充 靶区域的像素,从而达到图像修补的效果。

二、全变分模型原理

关于全变分模型的公式推断比较复杂,主要依据 欧拉-拉格朗日 方程,这里不再详述,直接提供手工推到过程。

三、算法步骤

全变分模型主要采用迭代的方式,逐步填充需要修补的区域,直至将所有靶区域像素全部填充完成。

令  是原始图像数据,  是每次迭代的图像数据

1、初始时 

2、接下来每次迭代时:

这里  、、 三个是迭代的参数

3、根据上面公式循环迭代操作 ,可以设置迭代的次数,最后一次的  是最终结果图像数据。

四、代码实现

这里提供一个简单的全变分图像修补算法

int32_t XImage::DenoizeTotalVariation(int32_t iterate_count, double_t dt, double_t epsilon, double_t lambda, XImage& out_img  )
{int32_t x, y, k;int32_t ret = 0;if (!image_valid_){return XERR_BAD_STATE;}// 分配矩阵数据int32_t pixel_count = width_ * height_;std::unique_ptr<double_t[]> mtx_org_ptr = std::make_unique<double_t[]>(pixel_count);std::unique_ptr<double_t[]> mtx_src_ptr = std::make_unique<double_t[]>(pixel_count);std::unique_ptr<double_t[]> mtx_dst_ptr = std::make_unique<double_t[]>(pixel_count);double_t* mtx_org = mtx_org_ptr.get( );double_t* mtx_src = mtx_src_ptr.get( );double_t* mtx_dst = mtx_dst_ptr.get( );// 将原始图像数据转换成灰度图,再归一化到二维矩阵中uint8_t* line_data = image_data_;k = 0;for (y = 0; y < height_; y++){uint8_t* rgb_data = line_data;for (x = 0; x < width_; x++){uint32_t  R = rgb_data[0] * 77;uint32_t  G = rgb_data[1] * 151;uint32_t  B = rgb_data[2] * 28;uint32_t  gray = (R + G + B) >> 8;mtx_org[k] = (double_t)(gray / 255.0f);mtx_src[k] = mtx_org[k];mtx_dst[k] = mtx_org[k];k++;rgb_data += pixel_bytes_;}line_data += line_bytes_;}int32_t  x_end = (width_ - 1);int32_t  y_end = (height_ - 1);double_t epsilon_pwr2 = epsilon * epsilon;double_t *org_data, *src_data, *dst_data;for (k = 0; k < iterate_count; k++){org_data = mtx_org;src_data = mtx_src;dst_data = mtx_dst;// 进行一次迭代操作for (y = 0; y < height_; y++){for (x = 0; x < width_; x++){double_t dbl_center_data = src_data[0] * 2.0f;double_t fourfold_center_data = src_data[0] * 4.0f;int32_t up    = y - 1;int32_t down  = y + 1;int32_t left  = x - 1;int32_t right = x + 1;if (up < 0)            up    = 0;if (down >= height_)  down  = y;if (left < 0)          left  = 0;if (right >= width_)  right = x;double_t* left_data  = src_data - 1;double_t* right_data = src_data + 1;double_t* up_data    = src_data - width_;double_t* dn_data    = src_data + width_;if (x == 0)        left_data  = src_data;if (x == x_end)    right_data = src_data;if (y == 0)        up_data     = src_data;if (y == y_end)    dn_data     = src_data;// 对x求一阶偏导double_t pd_x = (right_data[0] - left_data[0]) / 2;// 对y求一阶偏导double_t pd_y = (dn_data[0] - up_data[0]) / 2;// 对x求二阶偏导double_t pd_xx = (right_data[0] + left_data[0]) - dbl_center_data;// 对y求二阶偏导double_t pd_yy = (up_data[0] + dn_data[0]) - dbl_center_data;// 先对x再对y求二阶偏导double_t pd_xy = (right_data[0] + left_data[0] + up_data[0] + dn_data[0]) - fourfold_center_data;double_t pd_x_pwr2 = pd_x * pd_x;double_t pd_y_pwr2 = pd_y * pd_y;double_t temp_num = pd_yy * (pd_x_pwr2 + epsilon_pwr2) + pd_xx * (pd_y_pwr2 + epsilon_pwr2) - (2 * pd_x * pd_y * pd_xy);double_t temp_den = (pd_x_pwr2 + pd_y_pwr2 + epsilon_pwr2);//temp_den = pow(temp_den, 1.5);temp_den = temp_den * temp_den * temp_den;temp_den = sqrt(temp_den);dst_data[0] += dt * (temp_num / temp_den + lambda*(org_data[0] - src_data[0]));org_data++;src_data++;dst_data++;}}    // 当次迭代结果数据 作为下一次迭代的源数据memcpy(mtx_src, mtx_dst, pixel_count*sizeof(double_t));} // 迭代次数完成// // 将结果矩阵数据转换到图像数据中//if (!IsSameParameter(out_img)){out_img.Release( );ret = out_img.Allocate(PXL_FORMAT_8BIT_GRAY, width_, height_);XASSERT(ret == XOK);}uint8_t* gray_line = out_img.image_data_;src_data = mtx_src;for (y = 0; y < height_; y++){uint8_t* gray_data = gray_line;for (x = 0; x < width_; x++){int32_t gray_val = static_cast<int32_t>(src_data[0]*255);if (gray_val < 0)    gray_val = 0;if (gray_val > 255)  gray_val = 255;(*gray_data) = static_cast<uint8_t>(gray_val);gray_data += out_img.pixel_bytes_;src_data++;}gray_line += out_img.line_bytes_;}return XOK;
}void Test()
{XImage  org_img, atdenoise_img;org_img.LoadFromBmp("d:/input.bmp");int32_t iterate_count = 40;double_t epsilon = 0.1f;double_t dt = epsilon / 5.0f;double_t lambda = 0.01f;ret = org_img.DenoizeTotalVariation(iterate_count, dt, epsilon, lambda, atdenoise_img);atdenoise_img.SaveToBmp("d:/denoised.bmp");
}

总结

本章节主要描述全变分模型的图像去噪和修复效果,在正常应用中,如果对整个图像数据进行全变分迭代,则可以达到图像去噪的效果;如果仅仅对污损区域进行全变分迭代处理,则可以达到污损区域修复效果。不过在实际应用中,全变分模型仅仅适合非常细小区域的修补,对于大块污损区域的修补效果并不好,需要采用后续讲解到的其他的方法。

 

 


http://chatgpt.dhexx.cn/article/8PPXJNGq.shtml

相关文章

图像修复序列——BSCB模型

1. 参考文献 2. BSCB模型代码 2.1 BSCB模型demo % demo_BSCB.m % Author: HSW % Date: 2015/3/25 % HARBIN INSTITUTE OF TECHNOLOGY % % set matlab close all; clear all; clc;options.null 0; % read image Img imread(Image\butterfly.bmp); Img imread(Image\peppers…

day29:图像修复

在实际应用 中&#xff0c; 图像常常会受到噪声的干扰&#xff0c;例如拍照时镜头上存在灰尘或者飞行的小动物。这些 干 扰会导 拍摄到的图像出现部分内容被遮挡 的情况.对于较为久远的图像&#xff0c;可能只有实体图像而没有数字存储形式的底板&#xff0c; 因此相片在保存和…

【图像修复】基于深度学习的图像修复算法的MATLAB仿真

1.软件版本 matlab2021a 2.本算法理论知识 在许多领域&#xff0c;人们对图像质量的要求都很高&#xff0c;如医学图像领域、卫星遥感领域等。随着信息时代的快速发展&#xff0c;低分辨率图像已经难以满足特定场景的需要。因此&#xff0c;低分辨率图像恢复与重建的研究逐渐…

【毕业设计】深度学习图像修复算法研究与实现 - python

文章目录 1 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs5 最后 1 前言 &…

图像修复 图像补全_图像修复简介

图像修复 图像补全 In practical applications, images are often corroded by noise. These noises are dust or water droplets on the lens, or scratches from old photos, or the image is artificially painted or part of the image Itself has been damaged. 在实际应用…

Opencv--图像修复

Opencv–图像修复 前言 在实际应用中&#xff0c;我们的图像常常会被噪声腐蚀&#xff0c;这些噪声或是镜头上的灰尘或水滴&#xff0c;或是旧照片的划痕&#xff0c;或者是图像遭到人为的涂画&#xff08;比如马赛克&#xff09;或者图像的部分本身已经损坏。如果我们想让这…

数字图像处理之图像修复

目录 目标 实验 主函数&#xff1a;加噪声&#xff0c;扭曲原始图片&#xff0c;使用滤波器修复图片 子函数1&#xff1a;中心化图片 子函数2&#xff1a;加高斯噪声 子函数3&#xff1a;维纳反卷积滤波器 子函数4&#xff1a;逆滤波器 实验结果 原始图片&#xff0c;退化…

图像修复模型——TV模型

1. 参考文献 2. TV图像修复模型 2.1 TV模型 % demo_TV.m % Author: HSW % Date: 2015/3/25 % HARBIN INSTITUTE OF TECHNOLOGY % % set matlab close all; clear all; clc;options.null 0; % read image Img imread(Image\butterfly.bmp); % Img imread(Image\peppers.bmp…

图像修复 学习笔记

目录 局部卷积&#xff08;PConv&#xff09;图像修复 Pconv torch 实现&#xff1a; 局部卷积&#xff08;PConv&#xff09;图像修复 本文提出了局部卷积&#xff08;PConv&#xff09;层来处理不规则孔。图1显示了使用建议的PConv的一些修复结果。看样子还不错&#xff0…

基于改进Criminisi算法的图像修复

1、内容简介 略 516-可以交流、咨询、答疑 2、内容说明 摘 要&#xff1a;针对 Criminisi算法难以获得理想的修复效果&#xff0c;且存在修复时间过长等缺陷&#xff0c;提出一种改进 Criminisi算法的 图像修复算法。改进优先权计算方式找到最优待修复块&#xff0c;完善最优…

图像修复简介

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达推荐阅读 42个pycharm使用技巧&#xff0c;瞬间从黑铁变王者Google C项目编程风格指南 (中文版) 分享在实际应用中&#xff0c;图像经常被噪声腐蚀。这些噪音是镜头上的灰…

Halcon图像修复

1.之前研究OpenCV的图像修复时&#xff0c;知道Opencv提供的inpaint API能够实现这个效果。 void inpaint( InputArray src, 原图 InputArray inpaintMask, 二进制掩模&#xff0c;指示要修复的像素 OutputArray dst, 目标图像 double inpaintRadius, 像素周围的邻域补绘。…

图像修复

转自&#xff1a;https://blog.csdn.net/moxibingdao/article/details/107075598 本文继 去雨去雾去模糊篇 和 图像增强与图像恢复篇 之后&#xff0c;继续盘点CVPR 2020 中低层图像处理技术&#xff0c;本篇聚焦于图像修复&#xff08;Image Inpainting&#xff09;。 示例如…

CVPR 2020 论文大盘点-图像修复Inpainting篇

转自&#xff1a;https://mp.weixin.qq.com/s?__bizMzIwMTE1NjQxMQ&mid2247519592&idx2&sn3a0598c9f52e47929678a572ea451d98&chksm96f0ff3ca187762a107b4b9194e862b757d3d943ec399b35cbb7576cd92ee55cc648d7121ac3&scene21#wechat_redirect 本文继 去雨…

图像修复介绍

图像修复是一种利用缺损图像中已知部分的信息预测缺损区域的内容&#xff0c;允许使用替代内容取填充目标区域的技术。其最终目的是保证修复后的图像整体结构连贯统一&#xff0c;修复区域边缘处过渡自然&#xff0c;修复内容细节丰富合理&#xff0c;最好能够使观察者无法分辨…

【OpenCV】- 图像修复

说明&#xff1a;图像修复可以解决类似噪声或者是镜头上的灰尘或水滴或者旧照片上面的划痕等。 文章目录 1、实现图像修补&#xff1a;inpaint()函数2、opencv之鼠标响应函数3、示例程序 1、实现图像修补&#xff1a;inpaint()函数 说明&#xff1a;图像修补技术由inpaint()函数…

图像修复(Image Restoration)算法数据集详细介绍

目录 人脸数据集 1.Helen Face 2.CelebA (Celebrity Attribute) 3.CelebA-HQ 4.FFHQ&#xff08;Flickr-Faces-HQ&#xff09; 场景数据集 1.MS COCO (Common Objects in Context) 2.ImageNet 3.Places2 街景数据集 1.Paris StreetView 2.Cityscapes 纹理数据集 …

图像修复 : ICCV 2021 基于条件纹理和结构并行生成的图像修复【翻译】

声明&#xff1a;精简翻译&#xff0c;未完全校对 积压的存稿、好久没更文了、先发一篇这个代码很不错、推荐有兴趣的同学学习博主也写了对应的测评文章待发、点赞越多、发的越快如有同学&#xff0c;学有余力、可以转载这个文章&#xff08; 附原文地址即可 &#xff09;、校对…

Linux udhcpc/udhcpd 移植

参考文档&#xff1a; http://blog.chinaunix.net/uid-14704264-id-4272838.html https://www.cnblogs.com/chenfulin5/p/9481249.html 若系统busybox 自带了 udhcpc 和 udhcpd 工具 udhcpc 作为客户端工具&#xff0c;用于动态获取IP&#xff1b; udhcpd 作为服务器工具&…

udhcpc6的default.script

udhcpc6使用中遇到的问题 和udhcpc一样&#xff0c;udhcpc6是busybox中的一个工具&#xff0c;主要用来提供dhcpv6客户端服务。 在使用过程中遇到了一个问题&#xff0c;直接执行udhcpc6 -i eth0&#xff0c;可以看到打印信息中显示正在发送discover包&#xff0c;如果本地有…