CV2数字图像后处理



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

这是我在处理之前的数字图像 - 之前和之后 - 之后。但我想想象成这样。 处理后。 我使用以下代码来处理每个数字:

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 作为阈值参数来丢弃大多数伪影,但我的数字电路仍然是粗体/胖的,并且边界太清晰了。

问题是:如何处理图像以使其看起来像训练样本图像(较厚且边界模糊(?

我通过使用内核过滤找到了解决问题的方法。今天我偶然发现了一篇关于内核图像处理的文章,有一些"边缘检测"的内核,我都尝试过了,但没有一个足够好。但是我通过疏忽做了自己的内核,它对我来说效果很好! 所以,有代码:

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

将图像大小调整为更大的图像可以使图像在内核处理后清除"工件",我尝试在原始图像大小上执行此操作,但图像不像我的最终代码版本那样清晰。

结果

最新更新