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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/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
Image OpenCV-从图像中删除水平点或线会导致图像质量降低_Image_Opencv_Image Processing - Fatal编程技术网

Image OpenCV-从图像中删除水平点或线会导致图像质量降低

Image OpenCV-从图像中删除水平点或线会导致图像质量降低,image,opencv,image-processing,Image,Opencv,Image Processing,我跟随以删除图像中的水平点 此解决方案的主要思想是腐蚀图像(去除水平/垂直方向上的细小线条或圆点)和放大。但这会降低图像中字符的质量 所以我想问,是否有更好的解决方案来去除圆点,并且不丢失图像中字符的质量 原始图像: 结果: 代码: util: 如果线条与感兴趣的图形相交,则没有神奇的解决方案 但在这种情况下,它们并没有这样做,只需使用合适的兴趣区域来处理它们就足够了 例如,您可以仅检测点(top hat filter)并拟合直线。通过添加合适的边距,可以将图像分割为两个区域,可以对其应用任

我跟随以删除图像中的水平点

此解决方案的主要思想是
腐蚀
图像(去除水平/垂直方向上的细小线条或圆点)和
放大
。但这会降低图像中字符的质量

所以我想问,是否有更好的解决方案来去除圆点,并且不丢失图像中字符的质量

原始图像:

结果:

代码: util:


如果线条与感兴趣的图形相交,则没有神奇的解决方案

但在这种情况下,它们并没有这样做,只需使用合适的兴趣区域来处理它们就足够了

例如,您可以仅检测点(top hat filter)并拟合直线。通过添加合适的边距,可以将图像分割为两个区域,可以对其应用任何处理

例如,在下图中,下部已通过1x5垂直扩张进行清洁。您可以猜测分割边的设置位置



无论如何,这里有一个严重的问题:您需要完全去除虚线吗?

您可以使用
cv2.bitwise
操作仅通过屏蔽线区域来删除线。删除线条后,可以使用
cv2.inpaint
方法填充白色像素。您想看一看

是的,有时是实线。有时线条会与字符交叉。实线/虚线似乎会降低识别率。你能首先给出一些示例代码吗?边距是多少?如何添加它?我找到了直线,但不知道如何添加你提到的边距。@tom:两个或三个像素。
import util
import cv2

grayImage = cv2.imread("00.jpg", 0)

h = float(grayImage.shape[0])

maxVal = 255
blockSize = 15
C = 12.0*(90.0/h)

print("C:" + str(C))

showImages = []

bw = cv2.adaptiveThreshold(grayImage, maxVal, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize, C)
bw = ~bw

showImages.append(grayImage.copy())
showImages.append(bw.copy())

vertical = bw.copy()

# Specify size on vertical axis
# verticalsize = vertical.shape[0] / 20
verticalsize = 4

# Create structure element for extracting vertical lines through morphology operations
verticalStructure = cv2.getStructuringElement(cv2.MORPH_RECT, (1, verticalsize))

# Apply morphology operations
vertical = cv2.erode(vertical, verticalStructure, None, (-1,-1))
showImages.append(vertical.copy())

vertical = cv2.dilate(vertical, verticalStructure, None, (-1,-1))
showImages.append(vertical.copy())

util.showOpenCVImagesGrid(showImages, 2, 2, titles=["grayImage", "adaptiveThreshold", "after erode", "after dilate"])
import cv2
import matplotlib.pyplot as plt

def showOpenCVImagesGrid(images, x, y, titles=None, axis="on"):
    fig = plt.figure()
    i = 1

    for item in images:
        image = None
        title = None
        if type(images) is list:
            image = item
            if titles is not None:
                title = titles[i - 1]
        elif type(images) is dict:
            image = images[item]
            title = item

        if image is None:
            i += 1
            continue
        copy = image.copy()
        channel = len(copy.shape)

        cmap = None
        if channel == 2:
            cmap = "gray"
        elif channel == 3:
            copy = cv2.cvtColor(copy, cv2.COLOR_BGR2RGB)
        elif channel == 4:
            copy = cv2.cvtColor(copy, cv2.COLOR_BGRA2RGBA)

        fig.add_subplot(x, y, i)

        plt.title(title)
        plt.axis(axis)
        plt.imshow(copy, cmap=cmap)
        i += 1
    plt.show()