#python #image #numpy #image-processing
Вопрос:
Я пытался нарезать серым ровным слоем.
Это весь мой код, я пытаюсь преобразовать изображение в серую шкалу, не нарушая фон:
def without_background(img_path, save_path):
image = Image.open(img_path)
img_array = np.array(image,dtype=np.uint8)
img_shape=(image.width,image.height)
display(image)
for i in range(img_shape[1]):
for j in range(img_shape[0]):
v = img_array[i][j]
if(v>=0 and v<=50):
print(img_array[i][j]
img_array[i][j]=255
else:
img_array[i][j]=0
resultImage = Image.fromarray(img_array)
resultImage.save(save_path)
display(resultImage)
Это ошибка:
ValueError Traceback (most recent call last)
<ipython-input-23-a6d36de00a06> in <module>()
2 for j in range(img_shape[0]):
3 v = img_array[i][j]
----> 4 if(v>=0 and v<=50):
5 print(img_array[i][j])
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Комментарии:
1.
v
представляет собой массив. Значение истинности массива неоднозначно.2. Пожалуйста, добавьте фрагмент кода, который действительно читает изображение (создает
img_array
), к вашему вопросу
Ответ №1:
Изображения есть three dimensions
. посмотрите на этот пример, вы знаете, где вы ошибаетесь. если вы хотите проверить v
, вам нужно повторить v
, как показано ниже:
from PIL import Image
image = Image.open('1.png')
img_array = np.array(image,dtype=np.uint8)
print(img_array.shape) # (820, 892, 4)
img_shape=(image.width,image.height)
for i in range(img_shape[1]):
for j in range(img_shape[0]):
v = img_array[i][j]
print(type(v.shape)) # <class 'tuple'>
for k in v: # add this line
if (k>=0 and k<=50):
print(img_array[i][j])
img_array[i][j]=255
else:
img_array[i][j]=0
Ответ №2:
В вашем примере img_array[i][j]
возвращает np.array
значение (а не только одно значение), потому что оно возвращает значения RGB пикселя.
Если ваше изображение уже в оттенках серого и все 3 значения идентичны, вы можете просто взять, например, первое (красное), как это:
v = img_array[i][j][0]
Если ваше изображение еще не в оттенках серого, вы, вероятно, захотите взять среднее значение для каждого значения:
v = img_array[i][j].mean()
… или, возможно, сделать на нем более сложную математику.
Что на самом деле означает ошибка
Давайте возьмем этот небольшой пример:
>>> arr = np.array(range(4))
>>> arr
array([0, 1, 2, 3])
>>> arr > 1
array([False, False, True, True])
То, что мы получаем в результате этого сравнения, — это не просто одно логическое значение, а совершенно новое np.array
, заполненное результатом каждого отдельного сравнения. В основном расширяется вот так:
[0 > 1, 1 > 1, 2 > 1, 3 > 1]
Когда вы сейчас попытаетесь преобразовать это np.array
в одно логическое значение…
>>> if arr > 1: # which basically does: bool(arr > 1)
... pass
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
… вы получаете именно эту ошибку.
У вас есть два варианта, которые любезно предоставляет вам сообщение об ошибке:
- Используйте
(arr > 1).all()
значение true, если все значения больше 1. - Используйте
(arr > 1).any()
значение true, если какое-либо значение больше 1.