【问题标题】:Why np.ones creates a black image?为什么 np.ones 创建黑色图像?
【发布时间】:2019-02-22 12:52:49
【问题描述】:

我想了解np.zerosnp.ones之间的区别。在我的波纹管代码中,两者都创建了黑色图像。但是np.zerosnp.ones有什么用。我什么时候应该使用它们。什么目的。我知道np.ones 用 1 填充矩阵,但目的是什么。我想创建一个white image

img = np.ones((512,512,3), np.uint8)
cv2.imshow('IMG', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

img = np.zeros((512,512,3), np.uint8)
cv2.imshow('IMG', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【问题讨论】:

  • 我不确定除了“一个充满零值的 ndarray”或“一个充满一个值的 ndarray”之外,您还能期待什么进一步的答案。就 RGB 而言,我怀疑你真的会看到任何不同的东西。
  • uint8 类型的白色是 255
  • both create a black images - 不,一个创建黑色图像,另一个创建深灰色,其中所有像素都是rgb(1, 1, 1)
  • 因此,在具有 uint8 的 OpenCV 中,如果使用浮点数,则差异只是黑色阴影(0 或 1),它是黑色或白色,因为 OpneCV 在浮点数时使用 0-1 值
  • 从它的名字可以看出一个是创建数组填充1,另一个填充数组0

标签: python numpy opencv


【解决方案1】:

将您的数组初始化为float 数据类型。只有这样,0 表示黑色,1 表示白色:

img = np.ones((512,512,3), np.float)

说明: 当imshow 接收到一个整数数组时,它会假设 0 是最小值,255 是最大值,表示灰度图像中的黑白。但是,如果它接收到一个浮点数数组,它会将这些值设置为 0.0 和 1.0,因为它假定一个缩放输入。

【讨论】:

    【解决方案2】:

    np.zeros "返回一个给定形状和类型的新数组,用零填充。"

    np.ones "返回一个给定形状和类型的新数组,用一个填充。"

    np.zeros(10)
    Out: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
    np.ones(10)
    Out:array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
    

    【讨论】:

    • 什么,the documentation 中的内容有 3 个赞?
    • @meissner_ 不是。真正的问题只是隐藏在这句话中:'我想要创建一个白色图像'
    • @meissner_ 但事实并非如此。从上下文我们可以看出他们对 RGB 感到困惑
    • 许多编码人员缺乏这种基本技能:文档使用、研究、查找信息。因此,为什么我相信赞成票。 “什么目的。”建议问题的作者不了解 np.ones 和 np.zeros 做什么以及数组是什么,因为他不了解 np.ones((512,512,3)) 做什么。
    • @HuzaifSayyed 这就是为什么这不能回答你的问题。你误解了RGB,为什么1、1、1是白色的,0、0、0是黑色的?你需要 255、255、255
    【解决方案3】:

    您需要按像素中的位数进行缩放。例如,

    img = 255*np.ones((512, 512, 3), uint8)
    

    将生成 8 位像素的白色图像。

    【讨论】:

    • 这是一个迂回的方式,只需使用numpy.full并将填充值设置为255
    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 2015-05-13
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多