Проблема в том, что ваше изображение, как вы сказали, оттенки серого , поэтому в этой строке:
if pixels[i,j] == (225, 225, 225):
ни один пиксель никогда не будет равен триплету RGB (255,255,255)
, потому чтобелые пиксели будут просто шкалой оттенков серого 255
, а не RGB-триплетом.
Это прекрасно работает, если вы измените цикл на:
if pixels[i,j] == 29:
pixels[i,j] = 1
elif pixels[i,j] == 179:
pixels [i,j] = 2
else:
pixels[i,j] = 0
Вот результат с контрастным растяжением:
![enter image description here](https://i.stack.imgur.com/HYLCR.png)
Возможно, вы захотите выполнить преобразование, используя «Таблица поиска» или LUT, как большоечисла if
операторов могут быть громоздкими.По сути, каждый пиксель в изображении заменяется новым, найденным путем поиска его текущего индекса в таблице.Я делаю это с numpy
для развлечения тоже:
#!/usr/local/bin/python3
import numpy as np
from PIL import Image
# Open the input image
PILimage=Image.open("classified.png")
# Use numpy to convert the PIL image into a numpy array
npImage=np.array(PILimage)
# Make a LUT (Look-Up Table) to translate image values. Default output value is zero.
LUT=np.zeros(256,dtype=np.uint8)
LUT[29]=1 # all pixels with value 29, will become 1
LUT[179]=2 # all pixels with value 179, will become 2
# Transform pixels according to LUT - this line does all the work
pixels=LUT[npImage];
# Save resulting image
result=Image.fromarray(pixels)
result.save('result.png')
Результат - после растяжения контраста:
![enter image description here](https://i.stack.imgur.com/hsnad.png)
Возможно, я немного многословен выше, поэтому, если вам нравится более краткий код:
import numpy as np
from PIL import Image
# Open the input image as numpy array
npImage=np.array(Image.open("classified.png"))
# Make a LUT (Look-Up Table) to translate image values
LUT=np.zeros(256,dtype=np.uint8)
LUT[29]=1 # all pixels with value 29, will become 1
LUT[179]=2 # all pixels with value 179, will become 2
# Apply LUT and save resulting image
Image.fromarray(LUT[npImage]).save('result.png')