我正在阅读这样的图像:
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,但是以某种方式运行此代码时,我结束了像素列表中没有任何内容
答案 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渐变图片开始:
此处已放大:
然后像这样使用 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)