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