image = cv2.imread('black.jpg')[:,:,0] # let's just take the red channel alone for brevity
print(image[75:85,155:165]) # print middle 10x10
# output: [[0,0,0,....],...]
我希望从所有像素强度中减去1。是的,我绝对不希望0变为255。我只想让他们保持为0。
print(image[75:85,155:165]-1)
# output: [[255,255,255,....],...]
print(np.array(image[75:85,155:165])-1)
# output: [[255,255,255,....],...]
print(np.array(image[75:85,155:165], dtype='float32')-1)
# output: [[-1.,-1.,-1.,....],...]
我可以在uint8
之后将最后一个转换回.clip(0,255)
,但这并不是正确的做法。有没有办法直接进行(没有强制转换,如果条件对并行处理可能效率不高)?
答案 0 :(得分:2)
最好的方法是使用掩码np.where
:
grey_new = np.where(image == 0, 0, image - 1)
您可以在this answer和numpy.where文档中找到更多信息。
答案 1 :(得分:0)
一个简单的选择是:
image[75:85,155:165] - 1 * (image[75:85,155:165] > 0)
答案 2 :(得分:0)
由于你删除1到所有值,只有0值将变为255.那么,你可以做的只是将它们放回0:
a = np.array(image[75:85,155:165])-1
a[a==255] = 0