cv2数字图像后处理

2024-09-28 16:53:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图自己实现数字分类器。我也遇到了一些麻烦。我正在MNIST手写数据集MNIST sample digit上训练NN。但是当我试图预测数字是什么时,我从我用cv2找到并处理的图像中预测,正如你所看到的,我自己的图像有一个更胖的电路和清晰的边界

这是我在处理-Before之前和-After之后的数字图像。但我想把它想象成this。 经过处理。 我使用以下代码处理每个数字:

def main():
    image = cv2.imread('digit.jpg', cv2.IMREAD_GRAYSCALE)
    image = image.reshape((32,32,1))
    image = postprocess(image)

def postprocess(gray):
    kernel_size = 15
    blur_gray = cv2.GaussianBlur(gray,(kernel_size, kernel_size), 0)

    thresh = cv2.adaptiveThreshold(blur_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 3)

    return thresh

我使用11作为阈值参数来丢弃大部分伪影,但我的数字电路仍然粗体/肥胖,边界太清晰

问题是:如何处理image使其看起来像training sample image(更厚且边界模糊)


Tags: sample图像imagesizedef数字cv2kernel
1条回答
网友
1楼 · 发布于 2024-09-28 16:53:20

我通过使用内核过滤找到了问题的解决方案。今天我偶然发现了一个article about kernel image processing,有一些用于“边缘检测”的内核,我都试过了,但没有一个足够好。但是我做了自己的内核,这是一个疏忽,它为我工作得非常好! 因此,代码如下:

def main():
    image = cv2.imread('digit.jpg', cv2.IMREAD_GRAYSCALE)
    image = postprocess(image)
    image = image.reshape((32,32,1))

def postprocess(gray):
    gray_big = cv2.resize(gray, (256,256))

    kernel = np.array([[0,-2,0],[-2,10,-2],[0,-2,0]])
    filtered = cv2.filter2D(gray_big, -1, kernel)

    filtered = 255 - filtered
    filtered = filtered / 255
    filtered = cv2.resize(filtered, (32,32))

    return filtered

将图像大小调整为更大的大小可以使图像在内核处理后不受“工件”的影响,我曾尝试在原始图像大小上进行此操作,但图像不如最终代码版本中的图像清晰

result

相关问题 更多 >