图像处理:基于cv2.inpaint()图像修补

这篇具有很好参考价值的文章主要介绍了图像处理:基于cv2.inpaint()图像修补。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

今天我们将学习如何通过一种“修复”的方法消除旧照片中的小噪音,笔画等。当然,经过我的测试你也可以将其用于削弱混杂了其他的颜色的图像。

实验背景

大多数人家都会有一些旧的的旧化照片,上面有黑点,一些笔触等。你是否曾经想过将其还原?我们不能简单地在绘画工具中擦除它们,因为它将简单地用白色结构代替黑色结构,这是没有用的。在这些情况下,将使用一种称为图像修复的技术。基本思想很简单:用附近的像素替换那些不良区域,使其看起来和邻近的协调。考虑下面显示的图像(摘自Wikipedia)。

图像处理:基于cv2.inpaint()图像修补

同样的,今天我在这里也要进行一些拓展,采用我的方法也可以用于削弱混入了图像中的其他颜色。

获取图像的掩膜图

下面的图片是经过人脸检测后的图片,现在我并不想要它这个框。

图像处理:基于cv2.inpaint()图像修补

运行下面的脚本进行颜色提取

import cv2
import numpy as np
import pyps.pyzjr.utility as zjr

def empty(a):
    pass

path = 'AI.png'
cv2.namedWindow("TrackBars")
cv2.resizeWindow("TrackBars",640,250)
cv2.createTrackbar("Hue Min","TrackBars",58,179,empty)
cv2.createTrackbar("Hue Max","TrackBars",60,179,empty)
cv2.createTrackbar("Sat Min","TrackBars",73,255,empty)
cv2.createTrackbar("Sat Max","TrackBars",255,255,empty)
cv2.createTrackbar("Val Min","TrackBars",36,255,empty)
cv2.createTrackbar("Val Max","TrackBars",255,255,empty)
#经过测试得到的掩码58 60 73 255 36 255
while True:
    img = cv2.imread(path)
    #图像转化为HSV格式,H:色调S:饱和度V:明度
    imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    h_min = cv2.getTrackbarPos("Hue Min","TrackBars")
    h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")
    s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")
    s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")
    v_min = cv2.getTrackbarPos("Val Min", "TrackBars")
    v_max = cv2.getTrackbarPos("Val Max", "TrackBars")
    print(h_min,h_max,s_min,s_max,v_min,v_max)

    #创建一个蒙版,提取需要的颜色为白色,不需要的颜色为白色
    lower = np.array([h_min,s_min,v_min])
    upper = np.array([h_max,s_max,v_max])
    mask = cv2.inRange(imgHSV,lower,upper)
    imgResult = cv2.bitwise_and(img,img,mask=mask)

    imgStack = zjr.stackImages(0.7,([img,imgHSV],[mask,imgResult]))
    cv2.imshow("Stacked Images", imgStack)

    cv2.waitKey(1)

注:import pyps.pyzjr.utility as zjr,此为我的私库函数,大家可以使用matplotlib.pyplot as plt代替此功能。

这里有关于HSV的一些介绍,下面是一些常见颜色的HSV值,大家可以参考着在轨迹栏中进行调整,顺序都是从上到下,具体还是要根据实际情况进行调整。

图像处理:基于cv2.inpaint()图像修补

详解cv2.inpaint()

cv2.inpaint是用于图像修复的函数。它可以自动根据给定的掩膜(mask)来修复图像,即用图像中的其他部分来填充掩膜部分的像素。函数的语法如下:

dst = cv2.inpaint(src, inpaintMask, inpaintRadius, flags)

其中的参数的含义如下: 

  • src: 要修复的原始图像
  • inpaintMask: 修复图像的掩膜,即需要被修复的像素区域
  • inpaintRadius: 修复半径,即掩膜的像素周围需要参考的区域半径
  • flags: 修复算法的标志。有两个可选值:cv2.INPAINT_TELEA和cv2.INPAINT_NS。默认为cv2.INPAINT_TELEA。

其中,cv2.INPAINT_TELEA和cv2.INPAINT_NS分别代表基于快速行进算法(Fast Marching Method)和基于Navier-Stokes方程(Navier-Stokes equation)的修复算法,前者更快、后者更准确。

修补图像

接着,我们需要将上面脚本的这几行放进下面的测试代码中。

lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
mask = cv2.inRange(imgHSV,lower,upper)
imgResult = cv2.bitwise_and(img,img,mask=mask)

将调整好的值,从控制台中copy给h_min, h_max, s_min, s_max, v_min, v_max

import cv2
import numpy as np
import pyps.pyzjr.utility as zjr

path = 'AI.png'
img = cv2.imread(path)
Grayimg = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

h_min, h_max, s_min, s_max, v_min, v_max = 58, 60, 73, 255, 36, 255
lower = np.array([h_min,s_min,v_min])
upper = np.array([h_max,s_max,v_max])
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask_black = cv2.inRange(imgHSV, lower, upper)
imgResult = cv2.bitwise_and(img,img,mask=mask_black)
dst = cv2.inpaint(img, mask_black, 10, cv2.INPAINT_TELEA)
mask_white = cv2.bitwise_not(mask_black)

stackimg=zjr.stackImages(0.7,([img,imgResult],[mask_white,dst]))
cv2.imshow("repair_img",stackimg)
cv2.imwrite("AI2.png",dst)
cv2.waitKey(0)

运行结果如下所示, 效果比较不错,整体看来只有头发那里有些许模糊。

图像处理:基于cv2.inpaint()图像修补

改进建议

如果你有现成的掩膜图,那么去除的效果会更好;如果你需要遍历文件进行修改,所获得的HSV值并不适用于每一张图,建议单独进行处理。

改进方式:

  • 修改cv2.inpaint()参数,修复半径可以在合适的范围内进行修改,修复算法的标志,有两种方式可选cv2.INPAINT_TELEA和cv2.INPAINT_NS,其特点可以看看上面给出的详解,实际应用中,需要两种都试试,并不是cv2.INPAINT_NS就对这种图更准确。
  • 使用颜色提取脚本,可以将HSV值稍微调整大一些,可能会包含了一些其他的颜色,但对于我们的目标颜色(绿色)能够提取的更加完整,尤其是面对颜色比较复杂的场景,比如热力图,这个可以后期个人去尝试。
  • 使用np切片的方法,对掩膜图特定的区域进行保护。
x_threshold = 500
mask_black[:, x_threshold:] = 0
  • 如果是用于检测,对于部分不是很理想的图像,可以使用ps细致修改,当然这是你在用来我这个方法后,作为压箱底的措施。

总结

效果是达到了我的预期,本来按照我个人的想法也是将目标颜色的附近颜色进行替换,那这不得不遍历图像得像素点,但还好有Opencv中有inpaint()函数,得以实现本次实验。在这里我们就不讨论它的实现原理了,大家在CSDN上可以搜索到很多得资料。

图像处理:基于cv2.inpaint()图像修补
实验效果图

2023年5月7日修正

出现了一个bug,今天在测试时,文字为白色遮盖了我原本的图像,当我对图像进行上面的操作时,发现文字没有被消去,反而变为了黑色,如果要去消除,还需要再进行一次黑色文字的颜色提取,再用图像修补才达到我的预期。文章来源地址https://www.toymoban.com/news/detail-444096.html

到了这里,关于图像处理:基于cv2.inpaint()图像修补的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv(15) 图像平滑处理之二:cv2.GaussianBlur()高斯滤波

    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 高斯模板是通过对二维高斯函数进行采样(高斯模糊的卷积核里的数值满足高斯分布)、量化并归一化得到的,它考虑了邻域像素位置的影响,距离当前被平滑像素越近的点,加权系数越大

    2024年02月10日
    浏览(34)
  • opencv-34 图像平滑处理-2D 卷积 cv2.filter2D()

    2D卷积是一种图像处理和计算机视觉中常用的操作,用于在图像上应用滤波器或卷积核,从而对图像进行特征提取、平滑处理或边缘检测等操作。 在2D卷积中,图像和卷积核都是二维的矩阵或数组。卷积操作将卷积核在图像上滑动,对每个局部区域进行元素级别的乘法和累加

    2024年02月14日
    浏览(32)
  • python 图像处理——关于plt.imshow显示cv2.imread读取的图像有“色差”、“发蓝”问题的解决方法

    使用cv2.imread()读取图像时,默认彩色图像的三通道顺序为B、G、R,这与我们所熟知的RGB中的R通道和B通道正好互换位置了。 而使用plt.imshow()函数却默认显示图像的通道顺序为R、G、B,导致图像出现色差发蓝。 彩色图像出现色差代码: 运行结果如图1-1所示,其颜色偏蓝,怪吓

    2024年02月01日
    浏览(35)
  • Inpaint Anything:一键进行多种图像修补

    本文分享自华为云社区《绘制一切》,作者: 雨落无痕 。 相关链接: Notebook案例地址:绘制一切 AI Gallery:https://developer.huaweicloud.com/develop/aigallery/home.html 也可通过AI Gallery,搜索【绘制一切】一键体验! 通过一键点击标记选定对象,即可实现移除指定对象、填补指定对象、

    2024年02月15日
    浏览(53)
  • 《数字图像处理-OpenCV/Python》连载(1)前言

    本书京东优惠购书链接:https://item.jd.com/14098452.html 写作背景 编写本书的初衷,源自作者学习数字图像处理的经历。 在创新实验班开设的专业创新教育课程中,我选择的是数字图像处理方向。老师向我推荐的教材是冈萨雷斯的《数字图像处理》。学习的开始阶段非常困难。教

    2024年02月11日
    浏览(33)
  • Open CV 图像处理基础:(四)使用 Open CV 在 Java 中进行基本的图片模糊处理

    在Java中使用OpenCV进行图片模糊处理,主要可以通过以下几种方式: 均值模糊(Averaging Blur): 通过计算核窗口内所有像素的平均值来模糊图像。这种方法可以移除图像噪声,但也会使图像细节变得模糊。 这里src是原始图像,dst是模糊后的图像,new Size(10, 10)定义了核窗口的大

    2024年01月22日
    浏览(36)
  • open cv学习 (五) 图像的阈值处理

    demo1 demo2 demo3 demo4 demo5 demo6 demo7 demo8

    2024年02月12日
    浏览(26)
  • 【CV学习笔记】图像预处理warpaffine

    在学习图像预处理的时候发现,之前用的图像预处理方法一般为 resize和letter box,这两种方法比较低效,后来在手写AI中接触到了warpaffine,只需要一步就能够对图像进行预处理,同时还能很方便的进行cuda加速,于是便记录下来。 欢迎正在学习或者想学的CV的同学进群一起讨论与

    2023年04月08日
    浏览(37)
  • Open CV 图像处理基础:(五)Java 使用 Open CV 的绘图函数

    使用 Open CV 在 Java 中对图片使用绘图函数,分别绘制矩形、斜线、圆形、椭圆形以及添加文本 绘制矩形 参数说明: Mat img: 要绘制矩形的图像。 Point pt1: 矩形的一个顶点。 Point pt2: 与 pt1 相对的矩形的另一个顶点(不是矩形的对角线上的相邻顶点)。 Scalar color: 矩形的颜色。

    2024年02月02日
    浏览(38)
  • 数字图像处理 --- 相机的内参与外参(CV学习笔记)

    Pinhole Camera Model(针孔相机模型)         针孔相机是一种没有镜头、只有一个小光圈的简单相机。 光线穿过光圈并在相机的另一侧呈现倒立的图像。为了建模方便,我们可以把 物理成像平面 (image plane)上的图像移到 实际场景 (3D object)和 焦点 (focal point)之间,把他想象成

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包