Вот один из способов -
def stretch(a, lower_thresh, upper_thresh):
r = 255.0/(upper_thresh-lower_thresh+2) # unit of stretching
out = np.round(r*(a-lower_thresh+1)).astype(a.dtype) # stretched values
out[a<lower_thresh] = 0
out[a>upper_thresh] = 255
return out
В соответствии с ФП, набор критериев был:
«сдвиг» каждого пикселя выше 246
до 255
, следовательно, 247
и выше должны стать 255
.
каждый пиксель ниже 186
до zero
, следовательно, 185
и ниже должны стать 0
.
Следовательно, исходя из вышеупомянутых двух требований, 186
должно стать чем-то большим, чем 0
и так далее, до 246
, которое должно быть меньше, чем 255
.
В качестве альтернативы, мы также можем использовать np.where
, чтобы сделать его немного более компактным -
def stretch(a, lower_thresh, upper_thresh):
r = 255.0/(upper_thresh-lower_thresh+2) # unit of stretching
out = np.round(r*np.where(a>=lower_thresh,a-lower_thresh+1,0)).clip(max=255)
return out.astype(a.dtype)
Пробный прогон -
# check out first row input, output for variations
In [216]: a
Out[216]:
array([[186, 187, 188, 246, 247],
[251, 195, 103, 9, 211],
[ 21, 242, 36, 87, 70]], dtype=uint8)
In [217]: stretch(a, lower_thresh=186, upper_thresh=246)
Out[217]:
array([[ 4, 8, 12, 251, 255],
[255, 41, 0, 0, 107],
[ 0, 234, 0, 0, 0]], dtype=uint8)