网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

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

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

图像修补基本概念

在一幅需要修复的图像 中,我们将整幅图像用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 mtx_org_ptr = std::make_unique(pixel_count);
std::unique_ptr mtx_src_ptr = std::make_unique(pixel_count);
std::unique_ptr mtx_dst_ptr = std::make_unique(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(src_data[0]*255);
if (gray_val < 0) gray_val = 0;
if (gray_val > 255) gray_val = 255;
(*gray_data) = static_cast(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");
}

总结

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

来源:知乎

作者: 华叔-视觉魔术师

深延科技|

深延科技成立于2018年,是深兰科技(DeepBlue)旗下的子公司,以“人工智能赋能企业与行业”为使命,助力合作伙伴降低成本、提升效率并挖掘更多商业机会,进一步开拓市场,服务民生。公司推出四款平台产品——深延智能数据标注平台、深延AI开发平台、深延自动化机器学习平台、深延AI开放平台,涵盖从数据标注及处理,到模型构建,再到行业应用和解决方案的全流程服务,一站式助力企业“AI”化。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
未婚先孕横刀夺爱,曾轰动娱乐圈的“最强小三”,17年后活成这样

未婚先孕横刀夺爱,曾轰动娱乐圈的“最强小三”,17年后活成这样

翰飞观事
2026-05-30 14:26:12
1夜7大转会!曼联第二签,阿莱格里执教那不勒斯,B席加盟巴萨!

1夜7大转会!曼联第二签,阿莱格里执教那不勒斯,B席加盟巴萨!

田先生篮球
2026-05-30 09:35:25
全球票房26亿,中国版131分钟一刀不剪,悉尼妹这部R级大片够刺激

全球票房26亿,中国版131分钟一刀不剪,悉尼妹这部R级大片够刺激

八卦南风
2026-05-29 12:33:20
德云社突然宣布重要决定,曹云金被拉下水,难怪郭麒麟三拒接班人

德云社突然宣布重要决定,曹云金被拉下水,难怪郭麒麟三拒接班人

八斗小先生
2026-05-29 15:15:06
黄圣依直播被贾乃亮刷屏,杨子怒砸10万当榜一,黄圣依冷漠回应

黄圣依直播被贾乃亮刷屏,杨子怒砸10万当榜一,黄圣依冷漠回应

美芽
2026-05-30 18:03:56
男子3年不回家探望七旬独居老母,被母亲告上法庭,法院:每月支付500元赡养费且至少上门探望两次

男子3年不回家探望七旬独居老母,被母亲告上法庭,法院:每月支付500元赡养费且至少上门探望两次

都市快报橙柿互动
2026-05-30 12:16:05
西红柿的最佳搭配不是鸡蛋,而是它!夏天吃护血管,远离便秘

西红柿的最佳搭配不是鸡蛋,而是它!夏天吃护血管,远离便秘

芹姐说生活
2026-05-28 15:08:48
安洗莹身体亮红灯,倒成了陈雨菲的败因,胜负的天平看不懂

安洗莹身体亮红灯,倒成了陈雨菲的败因,胜负的天平看不懂

真理是我亲戚
2026-05-30 18:44:58
伊朗称对霍尔木兹海峡航运实施全面管理

伊朗称对霍尔木兹海峡航运实施全面管理

澎湃新闻
2026-05-31 03:04:01
林豆豆有多美?1966年和周总理合影,她22岁气质非凡,楚楚动人

林豆豆有多美?1966年和周总理合影,她22岁气质非凡,楚楚动人

历史龙元阁
2026-05-30 07:25:15
除毛岸英外,还有3位“高干子弟”入朝作战,各自结局如何?

除毛岸英外,还有3位“高干子弟”入朝作战,各自结局如何?

古今闲谈
2026-05-31 05:37:14
曝切尔西皇马酝酿重磅互换:恩佐换楚阿梅尼+现金

曝切尔西皇马酝酿重磅互换:恩佐换楚阿梅尼+现金

坠入温柔晚风
2026-05-30 01:49:54
“全女办公室”彻底失败!一人怀孕全员没水喝,最后哀求隔壁男人

“全女办公室”彻底失败!一人怀孕全员没水喝,最后哀求隔壁男人

谭谈社会
2026-05-30 14:46:59
高市正实质侵害中国这项权益!另其转移12万人令人想起冲绳岛战役……

高市正实质侵害中国这项权益!另其转移12万人令人想起冲绳岛战役……

新民周刊
2026-05-30 09:14:14
患精神疾病女子住院治疗时自缢成植物人,起诉医院索赔347万 一审判赔52万

患精神疾病女子住院治疗时自缢成植物人,起诉医院索赔347万 一审判赔52万

红星新闻
2026-05-30 14:30:41
法网女单太乱了:随着姆博科1-2出局,世界前十已有6将被送回家

法网女单太乱了:随着姆博科1-2出局,世界前十已有6将被送回家

侧身凌空斩
2026-05-31 03:56:40
李在明对全国发话:许多中国人将到韩国,务必让人家舒舒服服的!

李在明对全国发话:许多中国人将到韩国,务必让人家舒舒服服的!

墨印斋
2026-05-30 13:30:27
巴黎欧冠卫冕成功,阿森纳靠防守不会有欧冠奖杯,巴黎休息太久了

巴黎欧冠卫冕成功,阿森纳靠防守不会有欧冠奖杯,巴黎休息太久了

新新自圆其说说体育
2026-05-31 06:57:09
李玫瑾:越是聪明的孩子,越要尽早懂这两个道理,比成绩重要百倍

李玫瑾:越是聪明的孩子,越要尽早懂这两个道理,比成绩重要百倍

心理观察局
2026-05-31 07:07:13
再被曝光“圈路收费”的泸沽湖景区:已开通过境车辆专用通道

再被曝光“圈路收费”的泸沽湖景区:已开通过境车辆专用通道

南方都市报
2026-05-29 17:10:06
2026-05-31 07:36:49
深兰深延AI
深兰深延AI
让AI赋能更简单!
71文章数 0关注度
往期回顾 全部

科技要闻

车圈大佬发声:价格战远去,但竞争仍残酷

头条要闻

两名9岁女孩被困电梯近2小时 求救几十次物业无动于衷

头条要闻

两名9岁女孩被困电梯近2小时 求救几十次物业无动于衷

体育要闻

巴黎再度捧起欧冠奖杯 枪手众将黯然神伤

娱乐要闻

张碧晨《歌手》 “活人微死” 自嘲

财经要闻

双汇管不住一头猪

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

房产
艺术
时尚
本地
游戏

房产要闻

红动五月!全国抢入核心资产,广州盯紧凯旋新世界!

艺术要闻

我想有个小院,从此荒度余生

美回巅峰的她们,带火的这些爆款真的好用吗

本地新闻

用剪纸的方式,打开江苏扬州

巫师3新DLC跨十年:年轻玩家在初发售时还是小孩!

无障碍浏览 进入关怀版