Почему преобразование двух изображений в черно-белое дает два разных результата? - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь сделать небольшой проект по машинному обучению, и в процессе этого мне нужно преобразовать несколько изображений в черно-белые для классификации изображений.Моя проблема в том, что один и тот же метод дает совершенно разные результаты с одним и тем же алгоритмом.Вот изображение до того, как оно будет преобразовано Изображение 1 и это , как оно выглядит после того, как оно было преобразовано.Да, это работает хорошо, выглядит хорошо.

Это код, который я использовал.

test_img=Image.open(str(idx) + '.png')
test_img=test_img.resize((100,100),Image.ANTIALIAS)
test_img.show()
test_img=test_img.convert('1')

Теперь я попытаюсь сделать то же самое с этим изображением , которое дает этот результат.Как вы видите, астра превращается, у меня странные черные пятна по всему изображению.Вот код, который я использовал:

source_img=source_img.resize((100,100),Image.ANTIALIAS)
source_img=source_img.convert('1')
source_img.show() 

Я пробовал несколько методов для преобразования изображения в черно-белое, включая метод source_img.convert('L'), а с другими методами я не могу выровнять изображение водномерный массив.

Кто-нибудь знает, почему преобразование работает для первого изображения, но не для второго?

1 Ответ

0 голосов
/ 27 февраля 2019

Метод PIL convert("1") преобразует в черно-белое с использованием сглаживания, как состояние документов :

Стандартный метод преобразования шкалы серого («L») илиИзображение «RGB» в двухуровневое изображение (режим «1») использует сглаживание Флойд-Штейнберга для аппроксимации уровней яркости исходного изображения.

Дизеринг копирует много цветов с меньшим количеством, помещая шум в изображение, чтобы приблизить много цветов.Проверьте статью в Википедии на предмет дизеринга , чтобы узнать большеНапример, с этой страницы следующее изображение размыто - есть только черные и белые пиксели, но размытие заставляет его выглядеть в оттенках серого.Вот почему ваше второе изображение имеет некоторую зернистость - цвет не совсем белый, поэтому он пытается приблизить серый с несколькими пятнами черного.Не особенно убедительно, хотя это более впечатляюще для других типов изображений:

Dithered image

Если вы хотите преобразовать изображение в двоичную форму, самый простой способ - этоустановите порог, чтобы каждый пиксель выше этого порога считался белым, а все ниже - черным.Как документы для convert() состояния:

Если dither является NONE, все ненулевые значения установлены в 255 (белый).Чтобы использовать другие пороговые значения, используйте метод point().

, который вы можете найти в документах для здесь .Если вы хотите использовать OpenCV, вы можете сделать это через cv2.threshold(), документы здесь , учебное пособие здесь и связанный с ним предыдущий ответ о переполнении стека, который я дал здесь .

...