从 python 中的图像中移除黑色 background/black 杂散直线
Removing black background/black stray straight lines from an image in python
我正在尝试使用 Python 和 OpenCV 从这张图片中读取文本。
但是,如果这张照片混淆了文本输出并给出了错误的文本,角落会出现黑色背景。
我尝试使用代码在 OpenCV 中使用自适应高斯阈值:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img=cv.imread(file_path,0)
img = cv.medianBlur(img,5)
ret,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
th2 =cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,\
cv.THRESH_BINARY,11,2)
**th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv.THRESH_BINARY,11,2)**
titles = ['Original Image', 'Global Thresholding (v = 127)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in range(4):
plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
此代码的输出为AGT_result
如何只提取单词?
这是 Python/OpenCV 中的一种方法。
- 读取输入
- 将黑色的角落映射到白色,黑色阈值比您的文本稍暗,以减轻抗锯齿 white-black 过渡
- 使用morphology close清理虚线边框
- 保存结果
输入:
import cv2
import numpy as np
img = cv2.imread('text_black_corners.png')
# map the black corners to white
img2 = img.copy()
img2[np.where((img2 <= [150,150,150]).all(axis=2))] = [255,255,255]
# apply morphology close
kernel = cv2.getStructuringElement(cv2.MORPH_RECT , (3,3))
result = cv2.morphologyEx(img2, cv2.MORPH_CLOSE, kernel)
# write result to disk
cv2.imwrite("text_black_corners_removed.png", result)
# display it
cv2.imshow("img2", img2)
cv2.imshow("result", result)
cv2.waitKey(0)
结果:
作为 ad-hoc 解决方案,我们可以使用 cv2.floodFill
4 次 - 每个角一个:
img = cv.imread(file_path, 0)
rows, cols = img.shape
cv.floodFill(img, None, seedPoint=(0, 0), newVal=255, loDiff=1, upDiff=1) # Fill the top left corner.
cv.floodFill(img, None, seedPoint=(cols-1, 0), newVal=255, loDiff=1, upDiff=1) # Fill the top right corner.
cv.floodFill(img, None, seedPoint=(0, rows-1), newVal=255, loDiff=1, upDiff=1) # Fill the bottop left corner.
cv.floodFill(img, None, seedPoint=(cols-1, rows-1), newVal=255, loDiff=1, upDiff=1) # Fill the bottom right corner.
cv.medianBlur
后的结果:
我正在尝试使用 Python 和 OpenCV 从这张图片中读取文本。
但是,如果这张照片混淆了文本输出并给出了错误的文本,角落会出现黑色背景。
我尝试使用代码在 OpenCV 中使用自适应高斯阈值:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img=cv.imread(file_path,0)
img = cv.medianBlur(img,5)
ret,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
th2 =cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,\
cv.THRESH_BINARY,11,2)
**th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv.THRESH_BINARY,11,2)**
titles = ['Original Image', 'Global Thresholding (v = 127)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in range(4):
plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
此代码的输出为AGT_result
如何只提取单词?
这是 Python/OpenCV 中的一种方法。
- 读取输入
- 将黑色的角落映射到白色,黑色阈值比您的文本稍暗,以减轻抗锯齿 white-black 过渡
- 使用morphology close清理虚线边框
- 保存结果
输入:
import cv2
import numpy as np
img = cv2.imread('text_black_corners.png')
# map the black corners to white
img2 = img.copy()
img2[np.where((img2 <= [150,150,150]).all(axis=2))] = [255,255,255]
# apply morphology close
kernel = cv2.getStructuringElement(cv2.MORPH_RECT , (3,3))
result = cv2.morphologyEx(img2, cv2.MORPH_CLOSE, kernel)
# write result to disk
cv2.imwrite("text_black_corners_removed.png", result)
# display it
cv2.imshow("img2", img2)
cv2.imshow("result", result)
cv2.waitKey(0)
结果:
作为 ad-hoc 解决方案,我们可以使用 cv2.floodFill
4 次 - 每个角一个:
img = cv.imread(file_path, 0)
rows, cols = img.shape
cv.floodFill(img, None, seedPoint=(0, 0), newVal=255, loDiff=1, upDiff=1) # Fill the top left corner.
cv.floodFill(img, None, seedPoint=(cols-1, 0), newVal=255, loDiff=1, upDiff=1) # Fill the top right corner.
cv.floodFill(img, None, seedPoint=(0, rows-1), newVal=255, loDiff=1, upDiff=1) # Fill the bottop left corner.
cv.floodFill(img, None, seedPoint=(cols-1, rows-1), newVal=255, loDiff=1, upDiff=1) # Fill the bottom right corner.
cv.medianBlur
后的结果: