将图像中的像素值编辑为numpy数组

时间:2018-09-12 21:22:23

标签: python image numpy python-3.6

我正在阅读这样的图像:

img = np.array(Image.open(test_dir + image_name))

我想做的是在数组中找到一个值较高(250或更大)的区域,并将其减小10:

rows = img.shape[0]
cols = img.shape[1]
pixel = []
for x in range(0,rows):
    for y in range(0, cols):
        if x >= 122 and x <= 160 and y >= 34  and y <= 71:
            if img[x,y]>= 250:
                img[x,y] = img[x,y] -10
                pixel.append(img[x,y])

因此,根据不变图像,我要查看的区域应该是(122,34)到(160,71)的框,并且其像素数应超过250,但是以某种方式运行此代码时,我结束了像素列表中没有任何内容

3 个答案:

答案 0 :(得分:0)

要获得更紧凑的解决方案,您可以尝试

roi = img[122:161, 34:72]
pixel = roi[roi >= 250]
roi[roi >= 250] -= 10

答案 1 :(得分:0)

只要您的图像是灰度的,就可以做到。

inds = np.where(img>=250)
inds = inds[(inds.T[0]>=122)&(inds.T[0]<=160)&(inds.T[1]>=34)&(inds.T[1]<=71)]
img[inds]-=10

答案 2 :(得分:0)

最简单的方法是一行:

im[im>250]-=10

演示

从这张8x8渐变图片开始:

enter image description here

此处已放大:

enter image description here

然后像这样使用 IPython

# Load image as L (greyscale)
im = np.array(Image.open('image.png').convert('L'))

# View contents
im
Out[16]: 
array([[255, 255, 255, 255, 255, 255, 255, 255],
       [219, 219, 219, 219, 219, 219, 219, 219],
       [182, 182, 182, 182, 182, 182, 182, 182],
       [146, 146, 146, 146, 146, 146, 146, 146],
       [109, 109, 109, 109, 109, 109, 109, 109],
       [ 73,  73,  73,  73,  73,  73,  73,  73],
       [ 36,  36,  36,  36,  36,  36,  36,  36],
       [  0,   0,   0,   0,   0,   0,   0,   0]], dtype=uint8)

# Do required processing
im[im>250]-=10

# Review contents
In [18]: im
Out[18]: 
array([[245, 245, 245, 245, 245, 245, 245, 245],
       [219, 219, 219, 219, 219, 219, 219, 219],
       [182, 182, 182, 182, 182, 182, 182, 182],
       [146, 146, 146, 146, 146, 146, 146, 146],
       [109, 109, 109, 109, 109, 109, 109, 109],
       [ 73,  73,  73,  73,  73,  73,  73,  73],
       [ 36,  36,  36,  36,  36,  36,  36,  36],
       [  0,   0,   0,   0,   0,   0,   0,   0]], dtype=uint8)

让我们尝试减少更多像素,只是为了好玩:

In [19]: im[im>100]-=10

In [20]: im
Out[20]: 
array([[235, 235, 235, 235, 235, 235, 235, 235],
       [209, 209, 209, 209, 209, 209, 209, 209],
       [172, 172, 172, 172, 172, 172, 172, 172],
       [136, 136, 136, 136, 136, 136, 136, 136],
       [ 99,  99,  99,  99,  99,  99,  99,  99],
       [ 73,  73,  73,  73,  73,  73,  73,  73],
       [ 36,  36,  36,  36,  36,  36,  36,  36],
       [  0,   0,   0,   0,   0,   0,   0,   0]], dtype=uint8)