cv2数字图像后处理

问题描述 投票:-1回答:2

我正在尝试自己实施数字分类器。而且我遇到了一些麻烦。我正在MNIST手写数据集MNIST sample digit上训练NN。但是,当我试图预测数字是多少时,我根据使用cv2-cv2 processed digit找到并处理的图像进行了预测,如您所见,我自己的图像电路较粗,边界清晰。

这是我在处理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(较厚且边界模糊)?

python image-processing classification cv2
2个回答
0
投票

我使用此代码(C ++ opencv)完成了所需的转换:

Mat img__ = imread("E:/1.jpg", 0);
Mat img1;

resize(img__, img__, Size(), 5, 5); # I made it bigger for better visualization

imshow("original", img__);

threshold(img__, img1, 0, 255, THRESH_OTSU);

imshow("Otsu binarized", img1);

img1 = 255 - img1;

imshow("Reversed binarized", img1);

dilate(img1, img1, Mat::ones(5, 5, CV_8U));

imshow("dilated", img1);

Mat img2;
img2 = 255 - img1;

vector<Mat> pls;
pls.push_back(img1*0);
pls.push_back(img1);
pls.push_back(img1);
merge(pls, img1);

pls.clear();
pls.push_back(img2*0.5);
pls.push_back(img2*0);
pls.push_back(img2*0.5);
merge(pls, img2);

img2 = img1 + img2;

imshow("Colored", img2);

waitKey(0);

enter image description here


0
投票

我使用内核过滤找到了解决问题的方法。今天,我偶然发现了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

© www.soinside.com 2019 - 2024. All rights reserved.