python-3.x - 当同时存在白色和黑色背景时,如何将整个图像的背景转换为白色?
问题描述
表单图像包含不同背景的文本。图像需要转换为一个背景(此处为白色),因此标题需要转换为黑色。
输入图像:
我的方法是检测网格(水平线和垂直线并将它们相加),然后将网格的每个部分裁剪为新的子图像,然后检查大部分像素颜色并进行相应的变换。但是在实现之后,蓝色背景图像没有被检测到并被裁剪如下:
所以我试图将整个表单图像转换为一个背景,这样我就可以避免这样的结果。
解决方案
这是一种不同的处理方式,可以处理“反向视频”为黑色,而不是依靠一些色彩饱和度来找到它。
#!/usr/bin/env python3
import cv2
import numpy as np
# Load image, greyscale and threshold
im = cv2.imread('form.jpg',cv2.IMREAD_GRAYSCALE)
# Threshold and invert
_,thr = cv2.threshold(im,127,255,cv2.THRESH_BINARY)
inv = 255 - thr
# Perform morphological closing with square 7x7 structuring element to remove details and thin lines
SE = np.ones((7,7),np.uint8)
closed = cv2.morphologyEx(thr, cv2.MORPH_CLOSE, SE)
# DEBUG save closed image
cv2.imwrite('closed.png', closed)
# Find row numbers of dark rows
meanByRow=np.mean(closed,axis=1)
rows = np.where(meanByRow<50)
# Replace selected rows with those from the inverted image
im[rows]=inv[rows]
# Save result
cv2.imwrite('result.png',im)
结果如下所示:
中间closed
图像看起来像这样——我人为地添加了一个红色边框,这样你就可以在 Stack Overflow 的白色背景上看到它的范围:
推荐阅读
- haskell - Base64 规范编码
- java - 无法使用 Java Streams 取消计划任务列表
- swift - Swift 错误:无法构造“人类”,因为它没有可访问的初始化程序
- java - 尝试在 Eclipse 中使用 Java VisualVM
- python - Python多线程算法无法有效工作
- react-native - 在 createStackNavigator React Native 中看不到后退按钮
- matlab - MATLAB - 在不知道 x 实际值的情况下构建图形
- unity3d - Unity build 无法正确显示颜色
- azure-data-explorer - 尽管指定了 2 小时超时,但 ADX 命令活动在 1 小时后超时
- xcode - 删除按钮突出显示 SwiftUI