相关疑难解决方法(0)

从图像中删除嘈杂的线条

我有一些随机行的图片,如下所示:
在此输入图像描述
我想在它们上面应用一些预处理,以消除不必要的噪声(扭曲写入的线条),以便我可以将它们与OCR(Tesseract)一起使用.
我想到的想法是使用扩张来消除噪音,然后使用侵蚀来修复第二步中缺失的部分.
为此,我使用了这段代码:

import cv2
import numpy as np

img = cv2.imread('linee.png', cv2.IMREAD_GRAYSCALE)
kernel = np.ones((5, 5), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
img = cv2.erode(img, kernel, iterations=1)
cv2.imwrite('delatedtest.png', img)
Run Code Online (Sandbox Code Playgroud)

不幸的是,扩张效果不佳,噪声线仍然存在.

在此输入图像描述
我尝试改变内核形状,但情况变得更糟:写入被部分或完全删除.
我还找到了一个答案,说可以删除这些行

将具有两个或更少相邻黑色像素的所有黑色像素转换为白色.

这对我来说似乎有点复杂,因为我是计算机视觉和opencv的初学者.
任何帮助将不胜感激,谢谢.

python opencv image-processing noise-reduction

9
推荐指数
2
解决办法
1331
查看次数

如何去除文档图像中的水印?

我有以下图片

以及具有完全相同徽标的另一个变体

我试图去掉徽标本身,同时保留底层文本。使用以下代码段

import skimage.filters as filters
import cv2

image = cv2.imread('ingrained.jpeg')

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
smooth1 = cv2.GaussianBlur(gray, (5,5), 0)
division1 = cv2.divide(gray, smooth1, scale=255)

sharpened = filters.unsharp_mask(division1, radius=3, amount=7, preserve_range=False)
sharpened = (255*sharpened).clip(0,255).astype(np.uint8)

# line segments
components, output, stats, centroids = cv2.connectedComponentsWithStats(sharpened, connectivity=8)
sizes = stats[1:, -1]; components = components - 1
size = 100
result = np.zeros((output.shape))
for i in range(0, components):
    if sizes[i] >= size:
        result[output == i + 1] = 255

cv2.imwrite('image-after.jpeg',result)
Run Code Online (Sandbox Code Playgroud)

我得到了这些结果

但如图所示,所得到的图像在水印轮廓的残留和字母被洗掉方面分别不一致。有没有更好的解决方案可以补充?理想的解决方案是删除水印边框而不影响其下方的文本。

python opencv image image-processing computer-vision

9
推荐指数
2
解决办法
3762
查看次数

删除图像中的水平线(OpenCV,Python,Matplotlib)

使用以下代码,我可以删除图像中的水平线。参见下面的结果。

import cv2
from matplotlib import pyplot as plt

img = cv2.imread('image.png',0)

laplacian = cv2.Laplacian(img,cv2.CV_64F)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)

plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])

plt.show()
Run Code Online (Sandbox Code Playgroud)

结果

结果是非常好的,不是完美的但很好。我要实现的是这里显示的那个。我正在使用此代码

源图像 资源

我的问题之一是:如何保存Sobel X没有应用灰色效果的情况?作为原始但已处理..

另外,还有更好的方法吗?

编辑

对源图像使用以下代码是好的。效果很好。

import cv2
import numpy as np

img = cv2.imread("image.png")
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

img = cv2.bitwise_not(img)
th2 = cv2.adaptiveThreshold(img,255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,15,-2)
cv2.imshow("th2", th2)
cv2.imwrite("th2.jpg", th2)
cv2.waitKey(0)
cv2.destroyAllWindows()

horizontal = th2
vertical = th2 …
Run Code Online (Sandbox Code Playgroud)

python opencv image-processing matplotlib computer-vision

8
推荐指数
1
解决办法
4783
查看次数

从图像上删除边框,但保持文本写在边框上(在OCR之前进行预处理)

数字提取

有了上面的图像,我可以将其裁剪为四个方框,使用OpenCV形态学操作(基本膨胀,腐蚀)去除边界并得到如下结果:

二

在大多数情况下,这种方法效果很好,但是如果有人在该行上书写,则可以预测为7而不是2。

我在寻找一种解决方案时遇到了麻烦,该解决方案可以在删除边框的同时恢复写在行上的字符部分。我拥有的图像已经转换为灰度,因此我无法根据颜色区分书写的数字。解决这个问题的最佳方法是什么?

python ocr opencv image-processing computer-vision

3
推荐指数
1
解决办法
55
查看次数