【问题标题】:python: Show numpy padded image by opencvpython:通过opencv显示numpy填充图像
【发布时间】:2021-02-08 18:41:27
【问题描述】:

在 python 的 opencv 中,我加载了一张黑白图像。调整此图像的大小后,我在图像的每一侧添加了 5 个像素的填充:

resized_digit = cv2.resize(digit, (18,18))
cv2.imshow("resized Image", digit)

# Padding the digit with 5 pixels of black color (zeros) in each side to finally produce the image of (28, 28)
padded_digit = np.pad(resized_digit, ((5,5),(5,5)), "constant", constant_values=0)

如何通过 opencv 显示 padded_digit?因为当我尝试这样显示时:

cv2.imshow("Padded Image", padded_digit)

我收到了这个错误:

<class 'list'>
Traceback (most recent call last):

  File "<ipython-input-4-295bf6efa8c4>", line 39, in <module>
    padded_digit = np.pad(resized_digit, ((5,5),(5,5)), "constant", constant_values=0)

  File "<__array_function__ internals>", line 5, in pad

  File "/home/Alt/anaconda3/lib/python3.8/site-packages/numpy/lib/arraypad.py", line 746, in pad
    pad_width = _as_pairs(pad_width, array.ndim, as_index=True)

  File "/home/Alt/anaconda3/lib/python3.8/site-packages/numpy/lib/arraypad.py", line 521, in _as_pairs
    return np.broadcast_to(x, (ndim, 2)).tolist()

  File "<__array_function__ internals>", line 5, in broadcast_to

  File "/home/Alt/anaconda3/lib/python3.8/site-packages/numpy/lib/stride_tricks.py", line 180, in broadcast_to
    return _broadcast_to(array, shape, subok=subok, readonly=True)

  File "/home/Alt/anaconda3/lib/python3.8/site-packages/numpy/lib/stride_tricks.py", line 123, in _broadcast_to
    it = np.nditer(

ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (2,2) and requested shape (3,2)

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    您可以通过cv2.imread读取解决问题,然后将灰度(黑白)图像转换为cv2.COLOR_BGR2GRAY

    import cv2
    import numpy as np
    
    img = cv2.imread("input.jpg")
    gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    resized_digit = cv2.resize(gry, (18, 18))
    padded_digit = np.pad(resized_digit, ((5, 5), (5, 5)), "constant", constant_values=0)
    cv2.imshow("padded_digit", padded_digit)
    cv2.waitKey(0)
    

    imread以BGR方式加载图像,然后您可以使用COLOR_BGR2GRAY将其转换为灰度。

    您也可以使用copyMakeBorder (source) 代替np.pad。使用np.pad并没有错,但是opencv更适合图像操作,因为你使用的是opencv函数,比如imshowwaitKey等。

    例如:

    import cv2
    
    img = cv2.imread("input.jpg")
    gry = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    resized_digit = cv2.resize(gry, (18, 18))
    padded_digit = cv2.copyMakeBorder(resized_digit, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=0)
    cv2.imshow("padded_digit", padded_digit)
    cv2.waitKey(0)
    

    您可以通过比较它们的形状来检查两个图像是否相等。他们俩print(padded_digit.shape) 将是(28, 28)

    【讨论】:

    • 谢谢。这是原始图像以及调整大小和填充图像pasteboard.co/JNw246F.png。调整大小和填充的图像为什么质量不好?意思是为什么边缘化了?我该如何改进,以使所有边缘都像主图像一样柔和?@Ahx
    • 调整图像大小时需要使用interplotaion 参数。例如:resized_digit = cv2.resize(gry, (18, 18), interpolation=cv2.INTER_AREA)
    • pasteboard.co/JNwc04b.png , 这是改进的结束吗?因为我想添加到从 mnist 数据集创建的模型中以将图像编号预测为编号@Ahx
    • 等等!调整mnist的大小?你为什么要调整 mnist 数字的大小?,它们已经是28, 28?但您无需任何预处理即可轻松达到 99.2% 的准确率。
    • 完美,恭喜
    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 2015-10-05
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2017-05-28
    • 2015-12-03
    • 2013-09-12
    相关资源
    最近更新 更多