如何防止 IPAINTING 堵塞并改善着色

2024-03-24

我想从中删除所有使用 IPAINTING 的文本IMAGE https://i.stack.imgur.com/vxOdS.jpg。我一直在尝试各种方法,最终发现可以通过OCR获得结果,然后使用阈值MASK THE IMAGE。

processedImage = preprocess(partOFimg) 
mask = np.ones(img.shape[:2], dtype="uint8") * 255
for c in cnts:
        cv2.drawContours(mask, [c], -1, 0, -1)
img = cv2.inpaint(img,mask,7,cv2.INPAINT_TELEA)

预处理操作:

  ret,thresh1 = cv2.threshold(gray, 0, 255,cv2.THRESH_OTSU|cv2.THRESH_BINARY_INV)
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 3))
dilation = cv2.dilate(thresh1, rect_kernel, iterations = 1)
edged = cv2.Canny(dilation, 50, 100)
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
mask =

np.ones(img.shape[:2], dtype="uint8") * 255

当我运行上面的代码时,我这里是输出图像OUTPUT https://i.stack.imgur.com/C3Q2k.png。正如我们所看到的,它在图像上制作了一些不同颜色的块,我想防止这种情况发生,我该如何实现这一点?我发现很多时候蒙版图像都没有很好地形成,并且在文本为白色的情况下,预处理无法正确进行。 如何防止这些其他颜色的块在图像上形成?

灰色子图像GRAYED https://i.stack.imgur.com/i4AMq.png

阈值子IMG部分:阈值图像 https://i.stack.imgur.com/qLEzE.png

蒙版图像Masked https://i.stack.imgur.com/E22hL.png

EDIT 1:

NEW RESULT I've managed to get this new better result by noticing that my threshold is the best mask I can get. After doing this I performed the masking process 3 different times with variable masks and inversions. I did the inpainting algorithm 3 times, it basically the other times inverse the mask, because in some cases required mask is the inversed mask. Still I think it needs improvement, If I chose a different image the results are not so good.


Python/OpenCV 修复方法通常不适合您的图像类型。它们在薄(划痕状)区域而不是大块上效果最好。您确实需要一个示例类型方法,例如https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/criminisi_tip2004.pdf https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/criminisi_tip2004.pdf。但 OpenCV 没有这个。

然而,我怀疑 OpenCV 方法在这里确实有效,因为你填充的是恒定的颜色(绿色)而不是纹理。因此,您最好尝试仅获取字母(字符)的掩码,而不是单词的矩形块。因此,为了向您展示我的意思,这是我的 Python/OpenCV 方法。

Input:

  • 读取输入
  • 绿色标志上的门槛
  • 应用形态学将其关闭并保留为掩模1
  • 将蒙版应用于图像以将标志的外部变黑
  • 新图像中白色的阈值并保留为 mask2
  • 应用形态扩张将其稍微放大并另存为mask3
  • 进行修补
  • 保存结果

import cv2
import numpy as np

# read input
img = cv2.imread('airport_sign.jpg')

# threshold on green sign
lower = (30,80,0)
upper = (70,120,20)
thresh = cv2.inRange(img, lower, upper)

# apply morphology close
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (135,135))
mask1 = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# apply mask to img
img2 = img.copy()
img2[mask1==0] = (0,0,0)

# threshold on white
#gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
#mask2 = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
lower = (120,120,120)
upper = (255,255,255)
mask2 = cv2.inRange(img2, lower, upper)

# apply morphology dilate
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
mask3 = cv2.morphologyEx(mask2, cv2.MORPH_DILATE, kernel)


# do inpainting
result1 = cv2.inpaint(img,mask3,11,cv2.INPAINT_TELEA)
result2 = cv2.inpaint(img,mask3,11,cv2.INPAINT_NS)

# save results
cv2.imwrite('airport_sign_mask.png', mask3)
cv2.imwrite('airport_sign_inpainted1.png', result1)
cv2.imwrite('airport_sign_inpainted2.png', result1)

# show results
cv2.imshow('thresh',thresh)
cv2.imshow('mask1',mask1)
cv2.imshow('img2',img2)
cv2.imshow('mask2',mask2)
cv2.imshow('mask3',mask3)
cv2.imshow('result1',result1)
cv2.imshow('result2',result2)
cv2.waitKey(0)
cv2.destroyAllWindows()

Mask 3:

修复 1(Telea):

修补 2 (NS):

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止 IPAINTING 堵塞并改善着色 的相关文章

随机推荐

  • 降低滚动视图中平滑滚动的速度[重复]

    这个问题在这里已经有答案了 我有一个滚动视图 我执行 smooth scroll using smoothScrollBy 一切正常 但我想更改平滑滚动的持续时间 平滑滚动发生得非常快 用户不明白发生了什么 请帮助我降低平滑滚动速度 简单的
  • 通过蓝牙打印机 Android 打印 Pdf 文件

    在我的项目中需要通过蓝牙打印机打印Pdf文件 我写了一个代码通过pdf打印 它对于文本来说很好 但我想在蓝牙打印机上打印PDF文件 我的打印文本的java代码 Override public void onCreate Bundle sav
  • 如果类包含基类的成员,编译器可以利用空基优化吗?

    Consider struct base struct child base 众所周知sizeof child 可以通过应用 1空碱基优化 然而现在 考虑一下 struct base struct child base base b 编译器
  • 在jqgrid的列中添加图像

    我想在 jqgrid 的第一列中显示一个小图像 以显示从数据库获取的所有数据 jquery tableName jqgrid colNames colModel width 25 name someValue index somevalue
  • 访问数组数组内数组的行?

    说我有 H array a array b array c a 1 2 3 4 5 6 11 22 33 44 55 66 row 1 of H 0 111 222 333 444 555 666 b 7 8 9 0 1 2 77 88 9
  • 限制 JTextField 中输入的长度不起作用

    我试图限制用户可以在文本字段中输入的字符的最大长度 但它似乎不起作用 这是代码 text2 new JTextField Enter text here 8 我做错了什么吗 如何才能使限制正常工作 您当前的代码没有设置最大长度 而是定义可见
  • BroadcastReceiver 与 WakefulBroadcastReceiver

    有人可以解释一下两者之间的确切区别是什么BroadcastReceiver https developer android com reference android content BroadcastReceiver html and W
  • WPF - 如何在任一时间仅扩展一个扩展器

    我有一个带有一组扩展器的 StackPanel 如何设置它以便在任何时候都只扩展扩展器 Cheers AW 我真的不想这样做 因为它需要将代码 C 放在窗口文件后面的类中 我试图通过使用 ViewModels 等来完全避免这种情况 理想情况
  • 如何在 Bootstrap 4 中均匀分布导航栏元素

    为网站构建引导程序导航 我在弄清楚如何最好地间隔导航栏上的导航链接元素时遇到了一些麻烦 并继续在移动设备上看起来不错 我的导航栏代码是
  • Angular (v5) 服务正在 APP_INITIALIZER 承诺解析之前构建

    我期待 Angular 等到我的loadConfig 函数在构建其他服务之前解析 但事实并非如此 应用程序模块 ts export function initializeConfig config AppConfig return gt c
  • 如何在 Rails 中订购?

    我正在开发一个小型博客引擎 有以下表格 博客和消息 博客有一个外键 last message id 因此我通过调用 blog last message 来访问博客中的最 后一条消息 我有以下代码可以使其工作 class Blog lt Ac
  • 如何调用显式实现的接口方法的基类实现?

    我试图调用在基类上实现的显式实现的接口方法 但似乎无法让它工作 我同意这个想法很难看 但我已经尝试了我能想到的所有组合 但无济于事 在这种情况下 我可以更改基类 但我想我会问这个问题来满足我的一般好奇心 有任何想法吗 example int
  • pytz时区转换性能

    我有来自数据库的超过 100 万个日期时间对象 我想将它们中的每一个转换为时区感知的日期时间对象 这是我的辅助函数 conv tz dt is python datetime object src tz and dest tz and py
  • 两个相同查询(不同参数)的 MySQL InnoDB 死锁问题

    我有下表 CREATE TABLE IF NOT EXISTS task id int 10 unsigned NOT NULL AUTO INCREMENT job id int 10 unsigned NOT NULL COMMENT
  • JavaFX 2 ComboBox setValue() 不设置 CB 文本

    我的问题是 使用 setValue 选择后 所选的 ComboBox 项目文本在屏幕上不可见 以下是一些细节 将项目添加到我的 CB combo getItems add a combo getItems add b combo getIt
  • Android WebView 更新后卡在放大状态

    我们有一个使用 Android WebView 的应用程序 但更新到 v99 或 v100 后 它显示网页内容放大 更新后重新启动手机可以解决该问题 但只是暂时的 一段时间后 它将再次显示放大的网页 有没有人遇到过这个问题 是不是我们做错了
  • 关于查询而不是服务,最好、最全面的 SOAP 库是什么

    我的 google fu 并没有为 java 中的 SOAP 库提供非常有希望的结果 它们主要用于设置 SOAP 服务 因为我需要与这样的服务进行通信 我意识到 SOAP 只是构建和解析 XML 的问题 但理想情况下我希望对象映射和处理透明
  • 如何仅从类名获取 QMetaObject?

    我需要获取 QMetaObject 来动态创建对象实例 如果我知道该对象 那么 QObject metaObject 就是我所需要的 如果我知道该类 那么我可以使用 QObject staticMetaObject 变量 但是 如果我只知道
  • 如何使用 PHP 将 PFX 转换为 CRT 和 PEM?

    如何使用 PHP OpenSSL 函数将 pfx PKCS12 或 p12 证书转换为 crt 和 pem 这样我就可以避免使用公共服务器上不允许的命令行工具
  • 如何防止 IPAINTING 堵塞并改善着色

    我想从中删除所有使用 IPAINTING 的文本IMAGE https i stack imgur com vxOdS jpg 我一直在尝试各种方法 最终发现可以通过OCR获得结果 然后使用阈值MASK THE IMAGE processe