【问题标题】:How to optimize changing the value of 3d numpy.array if meet a condition如果满足条件,如何优化更改 3d numpy.array 的值
【发布时间】:2017-08-19 15:21:16
【问题描述】:

我正在研究 python - 在 Ubuntu 上打开 CV。 我是 python 的新手,我觉得我的编码没有优化。

最终目标是将像素颜色更改为 jpeg 图像。假设如果红色通道值

为此,我将 jpeg 转换为 numpy.array。 然后使用“for/in:”循环逐像素检查红色通道是否

我的代码:

import numpy
import cv2

img=cv2.imread('image.jpeg',1)

y=x=-1  # I use y and x as a counters. 
        #They will track the pixel position as (y,x)

for pos_y in img:
    y=y+1; x=-1 #For each new column of the image x is reset to -1
    for pos_x in pos_y:
        x=x+1
        b, g, r = pos_x  # I get the blue, green and red color
                         # please note that opencv is bgr instead of rgb
        if r < 255:
             r = 255
             pos_x = [b,g,r]
             img[y,x] = pos_x

cv2.imshow('Image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

此代码有效。但是,我觉得既不优雅也不高效。

如何优化代码并提高效率?

【问题讨论】:

  • 我的回答能解决你的问题吗?
  • 您实际检查和更改子像素值的位置不应该是r 而不是v
  • 克马里奥:是的,谢谢。请在您回答后查看我的评论 Paul Panzer:您是对的。我手动复制了代码并更改了变量的名称以使其更易于理解。已更正。

标签: python arrays numpy opencv image-processing


【解决方案1】:

这对于 RGB 图像怎么样?

img[img[:, :, 0] < 255, 0] = 255

使用它,我们从图像的红色通道创建一个布尔蒙版,并检查其值是否小于 255。如果是,那么我们将这些值设置为 255。

OpenCV 将图像读取为BGR,所以:

img[img[:, :, 2] < 255, 2] = 255

应该是合适的。

或者,您也可以这样做:

mask_R = img < 255)[:, :, 2]
img[mask_R, 2] = 255

例子:

In [24]: a
Out[24]: 
array([[[168],
        [170],
        [175]],

       [[169],
        [170],
        [172]],

       [[165],
        [170],
        [174]]])

In [25]: a > 170
Out[25]: 
array([[[False],
        [False],
        [ True]],

       [[False],
        [False],
        [ True]],

       [[False],
        [False],
        [ True]]], dtype=bool)

使用上述条件 (a &gt; 170),我们生成一个布尔掩码。现在,假设您采用任何一个通道并将其放在这个布尔掩码的顶部。而当我们分配新值时,只要掩码有true 值,图像数组中的那些对应元素就会被重置为新值。

# we just filter out the values in array which match our condition
In [36]: a[a > 170]
Out[36]: array([175, 172, 174])

# assign new values. Let's say 180
In [37]: a[a > 170] = 180   

In [38]: a
Out[38]: 
array([[[168],
        [170],
        [180]],    # <== new value

       [[169],
        [170],
        [180]],    # <== new value

       [[165],
        [170],
        [180]]])   # <== new value

【讨论】:

  • 是的,这很漂亮。我只是在等待更多的答案。你能解释一下你的答案吗?我得到了 img[:,:,0]
  • 用更多解释更新了我的答案
  • 不仅更优雅,而且效率更高。显示结果的时间大大缩短了
【解决方案2】:

如果 img 是 mxnx3 numpy 数组,则以下内容会就地更改第三个组件:

np.maximum(img[..., 2], 255, out=img[..., 2])

【讨论】:

    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多