Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从图像中提取带删除线的文本_Python_Opencv_Image Processing_Underline_Strikethrough - Fatal编程技术网

Python 从图像中提取带删除线的文本

Python 从图像中提取带删除线的文本,python,opencv,image-processing,underline,strikethrough,Python,Opencv,Image Processing,Underline,Strikethrough,下面是一个示例图像-> 我想提取具有删除线文本装饰/样式的文本。 因此,对于上面的图像,我想提取-de location 我该怎么做 以下是迄今为止我使用OpenCV和python所得到的: import cv2 import numpy as np import matplotlib.pyplot as plt im = cv2.imread(<image>) kernel = np.ones((1,44), np.uint8) morphed = cv2.morphologyE

下面是一个示例图像->

我想提取具有删除线文本装饰/样式的文本。 因此,对于上面的图像,我想提取-
de location

我该怎么做

以下是迄今为止我使用OpenCV和python所得到的:

import cv2
import numpy as np
import matplotlib.pyplot as plt
im = cv2.imread(<image>)
kernel = np.ones((1,44), np.uint8)
morphed = cv2.morphologyEx(im, cv2.MORPH_CLOSE, kernel)
plt.imshow(morphed)
我能拍到这张照片-

我尝试使用水平内核的值,但没有成功

更新2: 我进一步修改了上面的代码片段,得到了这个-

import cv2
import numpy as np
import matplotlib.pyplot as plt
# Load image, convert to grayscale, Otsu's threshold
result = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

kernel = np.ones((4,2),np.uint8)
erosion = cv2.erode(thresh,kernel,iterations = 1)
dilation = cv2.dilate(thresh,kernel,iterations = 1)

trans = dilation
# plt.imshow(erosion)

# Detect horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (8,1))
detect_horizontal = cv2.morphologyEx(trans, cv2.MORPH_OPEN, horizontal_kernel, iterations=10)
cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(result, [c], -1, (36,255,12), 2)
plt.imshow(result)
我能拍到这张照片- 这个解决方案也适用于我的其他图像类型-

这不是一个100%准确率的解决方案(未能获得删除文本),但我喜欢到目前为止的性能


现在,我正在努力检查相邻像素是否为黑色或白色,以隔离删除线。

实现这一点的一种方法是:

  • 将图像二值化()
  • 查找水平线()
  • 对于每一行,检查顶部和底部像素是否为白色
  • 如果有非白色的顶部和底部像素,则该区域对应于删除线
  • 执行图像的连接组件()
  • 检查与先前检测到的行相对应的标签,并屏蔽该标签以通过文本进行删除

  • 实现这一目标的一种方法是:

  • 将图像二值化()
  • 查找水平线()
  • 对于每一行,检查顶部和底部像素是否为白色
  • 如果有非白色的顶部和底部像素,则该区域对应于删除线
  • 执行图像的连接组件()
  • 检查与先前检测到的行相对应的标签,并屏蔽该标签以通过文本进行删除

  • 可以使用删除线特性,例如厚度。删除线的厚度小于下划线。它可以通过形态学进行选择,并通过形态学重建来恢复连接部件

    import cv2
    img = cv2.imread('juFpe.png', cv2.IMREAD_GRAYSCALE)
    thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV )[1]
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,5))
    kernel2=cv2.getStructuringElement(cv2.MORPH_RECT,(8,8))
    detect_thin = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
    detect_thin = cv2.morphologyEx(detect_thin, cv2.MORPH_DILATE, kernel2)
    marker=cv2.compare(detect_thin, thresh,cv2.CMP_LT) # thin lines
    while True: #morphological reconstruction
        tmp=marker.copy()
        marker=cv2.dilate(marker, kernel2)
        marker=cv2.min(thresh, marker)
        difference = cv2.subtract(marker, tmp)
        if cv2.countNonZero(difference) == 0:
            break
    
    cv2.imwrite('lines.png', marker)
    
    结果:

    您可以使用删除线属性,例如厚度。删除线的厚度小于下划线。它可以通过形态学进行选择,并通过形态学重建来恢复连接部件

    import cv2
    img = cv2.imread('juFpe.png', cv2.IMREAD_GRAYSCALE)
    thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV )[1]
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,5))
    kernel2=cv2.getStructuringElement(cv2.MORPH_RECT,(8,8))
    detect_thin = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
    detect_thin = cv2.morphologyEx(detect_thin, cv2.MORPH_DILATE, kernel2)
    marker=cv2.compare(detect_thin, thresh,cv2.CMP_LT) # thin lines
    while True: #morphological reconstruction
        tmp=marker.copy()
        marker=cv2.dilate(marker, kernel2)
        marker=cv2.min(thresh, marker)
        difference = cv2.subtract(marker, tmp)
        if cv2.countNonZero(difference) == 0:
            break
    
    cv2.imwrite('lines.png', marker)
    
    结果:

    谢谢你的回答。我一直走到第二步@nathancy的回答在第2步中对我部分有效。我更新了我的问题到目前为止。谢谢你的回答。我一直走到第二步@nathancy的回答在第2步中对我部分有效。我更新了我的问题到目前为止。谢谢你的回答。我正在尝试使用你的解决方案,但到目前为止,我的其他图像都失败了。这是我的另一张图片供你尝试——谢谢你的回答。我正在尝试使用你的解决方案,但到目前为止,我的其他图像都失败了。这是我的另一个图像样本供您尝试-