OpenCV与AI深度学习 | 使用OpenCV图像修复技术去除眩光

news2024/11/24 9:06:52

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。

原文链接:使用OpenCV图像修复技术去除眩光

    眩光是一种因过度和不受控制的亮度而引起的视觉感觉。眩光可能会使人丧失能力或只是让人感到不舒服。眩光是一种主观感受,对眩光的敏感度可能有很大差异。老年人通常对眩光更敏感,这是由于眼睛的老化特性。

  首先,我们需要检测眩光存在的位置。我们可以使用全局二值化轻松识别它们,因为当眩光通常存在时,该像素值大于 180。使用它可以检测到眩光。因此,我们需要获取大于 180 的像素,然后进行移除部分。

    下面的函数用于获取图像的蒙版,其中当像素大于 180 且低于其黑色时,像素为白色。我们将图像的实际眩光位置设为白色,而其他地方设为黑色。


def create_mask(image):
    gray = cv2.cvtColor( image, cv2.COLOR_BGR2GRAY )
    blurred = cv2.GaussianBlur( gray, (9,9), 0 )
    _,thresh_img = cv2.threshold( blurred, 180, 255, cv2.THRESH_BINARY)
    thresh_img = cv2.erode( thresh_img, None, iterations=2 )
    thresh_img  = cv2.dilate( thresh_img, None, iterations=4 )
    # perform a connected component analysis on the thresholded image,
    # then initialize a mask to store only the "large" components
    labels = measure.label( thresh_img, neighbors=8, background=0 )
    mask = np.zeros( thresh_img.shape, dtype="uint8" )
    # loop over the unique components
    for label in np.unique( labels ):
        # if this is the background label, ignore it
        if label == 0:
            continue
        # otherwise, construct the label mask and count the
        # number of pixels
        labelMask = np.zeros( thresh_img.shape, dtype="uint8" )
        labelMask[labels == label] = 255
        numPixels = cv2.countNonZero( labelMask )
        # if the number of pixels in the component is sufficiently
        # large, then add it to our mask of "large blobs"
        if numPixels > 300:
            mask = cv2.add( mask, labelMask )
    return mask

   我们在这个函数中所做的是,我们首先将图像转换为灰度,使用高斯矩阵(9x9)模糊图像以减少噪音。在全局阈值方法中将阈值设置为 180,将模糊图像转换为二进制图像,其中像素值高于 180 为白色,其他为黑色。我们可能会有小块噪音;为此,我们对二进制图像进行了一系列侵蚀和扩张。

    经过这种膨胀、腐蚀之后,我们的图像可能会出现小噪音。为此,我们对阈值图像进行了连通分量分析。scikit-image 库的 measure.labels 方法用于连通分量分析。使用 np.zeros 方法创建一个新的黑色图像,其形状与二值图像完全相同。它被称为掩码。

    我们开始循环遍历每个唯一标签。如果标签为零,那么我们知道我们正在检查背景区域,并且可以安全地忽略它。否则,我们只为当前区域构建一个掩码。然后计算 labelMask 中非零像素的数量。如果 numPixels 超过预定义的阈值(在本例中,总共300 个像素),那么我们认为该 blob“足够大”并将其添加到我们的掩码中。这种检测方法的灵感来自这里。作者在那里很好地解释了这种方法。

    所以我们的面具会像下面这样:

    我们发现了图像中的眩光/明亮之处。我们可以使用各种方法去除这些斑点。

    修复方法:

    CLAHE 方法

    OpenCV的修复方法

    在图像预处理中,用不同方法填充图像的某些区域称为修复。基本上,修复就是填补空白。

    那么我们可以在 python OpenCV 中使用哪些方法来填充它呢?您可以使用Naiver-Stokes 方法或 Fast — Marching 方法进行填充。

    Naiver-Stokes 方法

    可以使用偏微分方程更新区域的图像强度,并且可以通过图像拉普拉斯算子计算图像的平滑度(拉普拉斯算子是图像的二阶空间导数的二维各向同性度量。图像的拉普拉斯算子突出显示强度变化迅速的区域,因此经常用于边缘检测(参见零交叉边缘检测器)。拉普拉斯算子通常应用于首先用近似高斯平滑滤波器进行平滑的图像,以降低其对噪声的敏感性,因此这里将一起描述这两个变体。运算符通常将单个灰度图像作为输入并产生另一个灰度图像作为输出)

    拉普拉斯算子和偏微分方程可用于保留边缘并继续在平滑区域传播颜色信息。这是进行图像修复的方法之一。

https://www.math.ucla.edu/~bertozzi/papers/cvpr01.pdf

    快速行进法

    像素已知图像邻域的加权平均值用于修复图像平滑度。已知邻域像素和梯度用于估计要修复的像素的颜色。

https://www.semanticscholar.org/paper/An-Image-Inpainting-Technique-Based-on-the-Fast-Telea/67d0cb47d14150daff08980efbea9f1267d3a4e5

    我们可以使用上述任何一种算法来修复。

    如何在 OpenCV python 中使用:

dst = cv2.inpaint( src, inpaintMask,inpaintRadius,flags)
  • src → 输入的眩光图像

  • inpaintMask → 指示要修复的像素的二进制掩码。

  • dst → 输出图像

  • inpaintRadius → 要修复的像素周围的邻域。

  • flags → INPAINT_NS,(基于 Navier-Stokes 的方法) 或 INPAINT_TELEA (基于快速行进的方法)

    当我们选择 inpaintRadius 时,如果要修复的区域很薄,则较小的值会产生更好的效果(更少模糊)。

    让我们将其应用到我们的图像中:

参考链接:

https://dsp.stackexchange.com/questions/1215/how-to-remove-a-glare-clipped-brightness-from-an-image

matlab - How to Remove a Glare / Clipped Brightness from an Image? - Signal Processing Stack Exchangeicon-default.png?t=N7T8https://dsp.stackexchange.com/questions/1215/how-to-remove-a-glare-clipped-brightness-from-an-image

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

源控终端|为么叫源控终端以及SDAF-8860源控终端具备发电单元次/超同步振荡监测监视,告警的功能在新能源场站中的应用

源控终端|为么叫源控终端以及SDAF-8860源控终端具备发电单元次/超同步振荡监测监视,告警的功能在新能源场站中的应用 SDAF-8860源控终端具备发电单元次/超同步振荡监测监视,告警的功能在新能源场站中的应用 SDAF-8608源控终端具有发电单元并网、脱网、低穿等信息快速采集与传输…

数据库;SQL语言; 数据库编程

数据库: 1.概念: 文件:存放数据,掉电数据不会丢失,软件的配置及想要持续保存的数据放入文件中 大批量数据存储和管理时使用数据库 2.类型: 1.关系型数据库 1.Or…

项目启动报错:liquibase.lockservice:? - Waiting for changelog lock....

异常报错: 原因 工作流表部分日志表被锁,可能上次未正常终止程序导致的异常。 处理 登录mysql指定项目对应数据库 SELECT * FROM DATABASECHANGELOGLOCK; UPDATE DATABASECHANGELOGLOCK SET locked0, lockgrantednull, lockedbynull WHERE id1;

通过Qt Creator Plugin开发Qt Creator插件-【金丹篇】

1.前言 由于工作学习需要基于Qt Creator架构开发类似的插件,本人感慨网络上Qt 相关的文档真是少。我直接在官方社区查找Qt Creator Plugin愣是一点资料没有。其实想想也是自定义的三方插件到Qt的IED,主要是个社区的贡献者或官方技术人员自用,他开发布会…

仿OpenAI网页前端制作的ChatGPT,超仿真!!!自定义!!!

仿OpenAI网页前端制作的ChatGPT,超仿真!!!自定义!!! 基于C#和WPF的仿真ChatGPT项目 啊没错我是标题党啊,下面内容AI生成的,主要是介绍我基于C#和WPF制作的仿真ChatGPT项…

【HTTP学习】HTTP协议

HTTP介绍 HTTP请求 这里的get没有请求体,会在网站中直接显示提交的表单。而post提交会将请求参数存放在表单中,需要通过F12进行查看。 HTTP响应 HTTP协议解析

一次不严谨的C++、C、Pascal、Rust等对比

起因 现在ACM用得多的基本上就两种语言,C和Python3,还有部分Java,但是当年ACM必学的Pascal、新近流行的rust也有人用,只不过用户很少。 就以一道codeforce上的算法小题为样本,来对比一样用户数量、执行效率、易写程度…

校园综合服务小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,卖家管理,发布信息管理,订单信息管理,类型管理,系统管理 微信端账号功能包括:系统首页,发布信息&#xff0…

【PyCharm】从零到一:Python爬虫实战教程,小白、绕过反爬虫机制、实战案例全解析

文章目录 前言一、使用的工具二、安装必要的库三、编写程序1.引入库2.发送GET请求3.绕过反爬虫机制4.解析HTML内容5.输出需要的内容 四、完整源码总结 前言 爬虫(Web Crawler)是一种自动浏览万维网并从中收集信息的程序。它们常被用于搜索引擎、数据分析…

基于UDP/TCP的 c/s 通信模型

基于UDP c/s通信模型 客户端(socket;sendto ...) 服务器端 ---把自己的地址公布出去 (socket;bind //绑定; recvfrom ...) 1.recvfrom函数: ssize_t recvfrom( int sockfd, /…

浮毛难清除、异味难消散?选到不好的宠物空气净化器会有什么危害

近年来,不少人家里都养了宠物,有些是猫、有些是狗,甚至有些是兔子,不少人希望能通过它们抒发心中的郁闷,成为自己的搭子。这些宠物在能带来欢乐的同时也会带来一些小烦恼,比如宠物的浮毛、异味都困扰着我们…

Linux日志管理基本介绍及日志轮替原理

😀前言 本篇博文是关于日志管理,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉&#x…

ai智能写作生成器哪个好用?推荐五款!

在内容创作日益重要的今天,ai智能写作生成器成为了众多创作者的得力助手。它们不仅能提高写作效率,还能提升写作内容的质量。然而,市场上的ai智能写作生成器众多,选择一个合适的生成器并非易事。本文将为你推荐5款好用的ai智能写作…

[图解]用例规约之业务规则不是算法

1 00:00:01,530 --> 00:00:03,090 像这种某某算法之类的 2 00:00:03,100 --> 00:00:04,130 它往往是什么 3 00:00:05,590 --> 00:00:07,440 某种实现的一个选择 4 00:00:08,140 --> 00:00:09,550 它很可能不是需求 5 00:00:10,620 --> 00:00:13,240 你要问他…

汉服推广网站

TOC springboot0790汉服推广网站 绪论 1.1研究背景 随着网络不断的普及发展,汉服文化平台网站依靠网络技术的支持得到了快速的发展,首先要从用户的实际需求出发,通过了解用户的需求开发出具有针对性首页、汉服知识、服装展示、用户相册、…

实训day34(8.22)

一、回顾 高并发集群 饿了么后端的登录模块 1、数据库 1. 主从复制(高可用) 2. 传统的主从复制 3. gtids事务型的主从复制 4. 注意 1. server_id唯一 2. 8.x版本需要get_ssl_pub_key 3. 5.x不需要 4. change master to 5. stop | start slave 5. 非交互 import pymys…

Redis7基础篇(八)

redis集群 是什么 能干吗 集群算法-分片-槽位slot redis集群的槽位slot redis集群的分片 分片和槽位的优势 槽位映射的解决方案 上面的三个方案分别对应了小厂 中厂 大厂 哈希槽取余分区 缺点 一致性哈希算法分区 小总结 哈希槽分区 经典面试题 这里说的redis是ap而不是cp的 …

全球著名地标卫星影像收藏第3辑

世界那么大,一起去看看! 我们在《全球著名地标卫星影像收藏第2辑》一文中,为大家分享了10全球著名地标高清卫星影像,现在继续为大家分享10个著名地标。 我们整理的这些地标KML文件可以分享大家,你也可以打开相应的UR…

哪款骑行耳机值得入手?精选五款热门骑行耳机实测分析!

骨传导耳机作为骑行爱好者最受欢迎的数码装备之一,凭借其独特优势在骑行爱好者中广受好评,然而由于骨传导耳机市场上品牌众多,它们的品质良莠不齐,让众多消费者无从下手,特别是那些缺乏专业技术支撑的劣质产品&#xf…

Day97:云上攻防-云原生篇KubernetesK8s安全APIKubelet未授权访问容器执行

知识点: 1、云原生-K8s安全-名词架构&各攻击点 2、云原生-K8s安全-Kubelet未授权访问 3、云原生-K8s安全-API Server未授权访问 K8S集群 Kubernetes是一个开源的,用于编排云平台中多个主机上的容器化的应用,目标是让部署容器化的应用…