【问题标题】:Saving Array as Image in cv2将数组保存为 cv2 中的图像
【发布时间】:2020-04-29 08:37:39
【问题描述】:

我正在尝试使用 python cv2 修改图像。所以我将图像导入 python 并将其表示为一个数组。然后我将图像的红色通道更改为全0,然后将更改后的数组保存到图像中。在这里我发现了问题,当我加载更改后的图像时,更改后的图像的红色通道不全为 0(但它必须全为 0 对吗?因为我已经做了这个过程)。我感到很困惑。我做错什么了吗?

代码如下:

im = cv2.imread("original.jpg",1)

[h,w,c] = im.shape
//print(im[:,:,0])

img2 = im.copy()

for i in range(0,h):
    for j in range(0,w):
        img2[i,j,0] = 0

cv2.imwrite("changed.jpg", img2)

这是原来的红色通道

[[ 41  17  40 ...  61  82 104]
 [ 48  31  27 ...  76  51  38]
 [ 61  58  29 ...  57  53 109]
 ...
 [123 140 147 ...  95  88  74]
 [133 160 155 ...  85  83  89]
 [ 96  78  84 ...  43  47  38]]

这是更改后的红色通道(它必须全为 0,但不是)

[[ 9  0 10 ...  0  9 30]
 [10  0  0 ...  7  0  0]
 [15 14  0 ...  0  0 19]
 ...
 [ 0  1  5 ... 13  4  0]
 [ 9 31 21 ... 13 12 15]
 [ 0  0  0 ...  0  0  0]]

【问题讨论】:

  • OpenCV imread/imwrite 使用 BGR 顺序 - 您正在修改红色通道,而不是蓝色通道。

标签: python opencv image-processing


【解决方案1】:

我在代码中看到了几个需要解决的问题:

  • 在 Python 中,cmets 以 # 开头,而不是附加的 sn-p 中的 //
  • 使用嵌套的 for 循环遍历图像是我们可以采用的最慢的方法。尝试寻找可以完成相同工作的 numpy 方法,而不是使用嵌套的 for 循环。在大多数情况下,numpy 例程要快得多。
  • OpenCV 遵循 BGR 约定而不是 RGB 约定。因此,要访问红色通道,您需要获取颜色数组中的第三个元素,而不是第一个。

修复问题后,您的代码可能如下所示:

im = cv2.imread("original.jpg",1)

im[:,:,2] = 0

cv2.imwrite("changed.jpg", im)

【讨论】:

  • 好的,谢谢,我不知道 BGR 约定,但这并不意味着什么正确(?)因为我改变了(例如)第 0 个频道,然后我也看看更改后的图像中的第 0 个通道。
  • 您能否确保在检查频道时正在阅读changed.jpg 图像。您可以在cv2.imwrite() 之前试用我的代码并检查频道吗?
  • 是的,我在保存之前检查了通道,它是真的(全为 0),但是如果我保存了它,然后我再检查它,它就会改变。我确定我正在阅读changed.jpg。你觉得跟数组类型有关系还是什么?
  • 所以问题出在.jpg 格式这里。它是一种松散的格式,因此它可能会破坏底层像素值以在压缩时节省一些 Kbs。您可以使用.png 格式,这是一种无损格式。
猜你喜欢
  • 2022-07-12
  • 2013-10-14
  • 1970-01-01
  • 2020-02-27
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多