从图像中去除 OCR 的噪声

Posted

技术标签:

【中文标题】从图像中去除 OCR 的噪声【英文标题】:removing noise from the image for OCR 【发布时间】:2021-08-16 04:15:52 【问题描述】:

我正在为我的OCR Project 使用以下图片

我的主要目标是在图像预处理期间从图像中删除pen marks。我继续进行了一些图像预处理,如下所示:

import cv2
from matplotlib import pyplot as plt
image_file = "out.jpg"
img = cv2.imread(image_file)
def grayscale(image):
    return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

gray_image = grayscale(img)
#binarization of image
thresh, im_bw = cv2.threshold(gray_image, 210, 230, cv2.THRESH_BINARY)
cv2.imwrite("bw_image.jpg", im_bw)

现在要去除噪点,即pen marks,我写了以下噪点去除函数,但笔迹没有去除,输出几乎与二值图像相同。

def noise_removal(image):
    import numpy as np
    kernel = np.ones((1, 1), np.uint8)
    image = cv2.dilate(image, kernel, iterations=3)
    kernel = np.ones((1, 1), np.uint8)
    image = cv2.erode(image, kernel, iterations=3)
    image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
    image = cv2.medianBlur(image, 3)
    return (image)

如果有人可以指导我如何有效地减少图像中的噪点,以便我们摆脱@​​987654328@。此外,我还想了解图像缩放以及如何将其合并到我的代码中。我在这个平台上尝试了各种其他答案,但都没有奏效。谢谢。

【问题讨论】:

【参考方案1】:

这是一个可能的解决方案:定义一个以蓝色为目标的HSV 范围。使用该图像创建一个二进制蒙版,使用形态学对其进行一点清理,并将其添加到原始图像的灰度版本中。

这是代码:

# Imports:
import cv2
import numpy as np

# image path:    
path = "D://opencvImages//"
fileName = "M8N7o.jpg"

# Reading an image in default mode:
inputImage = cv2.imread(path + fileName)

# Convert RGB to grayscale:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)

# Convert the BGR image to HSV:
hsvImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2HSV)

# Create the HSV range for the blue ink:
lowerValues = np.array([103, 0, 70])
upperValues = np.array([144, 187, 225])

# Get binary mask of the blue ink:
bluepenMask = cv2.inRange(hsvImage, lowerValues, upperValues)

该位创建此二进制掩码:

如果我们使用形态学,我们可以稍微清理一下。让我们使用Closing,它是一个膨胀,后跟一个腐蚀 来连接被分离的位。之后我们就有了一个可以添加到原始灰度图像中的白色蒙版,如下所示:

# Use a little bit of morphology to clean the mask:
# Set kernel (structuring element) size:
kernelSize = 3
# Set morph operation iterations:
opIterations = 1
# Get the structuring element:
morphKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernelSize, kernelSize))
# Perform closing:
bluepenMask = cv2.morphologyEx(bluepenMask, cv2.MORPH_CLOSE, morphKernel, None, None, opIterations, cv2.BORDER_REFLECT101)

# Add the white mask to the grayscale image:
colorMask = cv2.add(grayscaleImage, bluepenMask)

最后,对颜色蒙版进行阈值化,得到二值蒙版:

# Threshold via Otsu:
_, binaryImage = cv2.threshold(colorMask, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow("binaryImage", binaryImage)
cv2.waitKey(0)

这会产生最终图像:

【讨论】:

是否有更稳健的方法,我们可以将噪声分类为高斯噪声并应用任何内置的噪声去除方法? @Junaid 1) 什么噪音? 2)为了建模和分类,你会量化这种噪声的什么特征? 我在谈论一种更强大的方法。这种方法无疑是有效的,但我们是严格为蓝色墨水做的。 @Junaid 好吧,你想删除笔迹,对吧?如果您要求一种自动检测噪声的方法(在这种情况下,“噪声”是一个非常宽泛的术语,包含原始图像上没有的所有内容)并将其过滤掉,那么您就是研究一个更大、更困难的问题。一个我们甚至不确定如何定义我们应该过滤掉的问题。这超出了这个平台的范围。您可能想研究信号处理技术或基于 AI 的技术,并了解该特定问题的最新技术。

以上是关于从图像中去除 OCR 的噪声的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MATLAB 中的图像中去除高斯噪声?

使用傅里叶变换从图像中去除周期性噪声

从图像中去除高频垂直剪切噪声

从图像中去除背景噪音,使 OCR 的文本更清晰

如何使用python从图像中去除边界边缘噪声?

使用opencv去除噪声像素