Рубрики
Без рубрики

Начать с изображениями

Данное назад я начал путешествие в компьютерную науку с программой CS50 Гарвардского университета. I… Помечено Python, начинающим.

Данное назад я начал путешествие в информатике с Программа CS50 Гарвардского университета Отказ На неделе 0 (Вычислительное мышление; язык программирования царапин), я столкнулся с увлекательной идеей: Изображения могут в основном быть представляемыми целыми числами И я был подключен к этому.

Примечание : Концепции, охватываемые языком программирования царапин, такие как переменные, функции, петли, условные условия, достаточны, чтобы начать работу с игрой с изображениями, но я должен был понять много вещей самостоятельно. Перемещение вперед, я выбрал Python & The OpenCV библиотеку для этой деятельности, потому что переход от языка программирования царапин в Python, очень гладко.

Что такое изображения, именно?

Изображения в основном коллекция пиксели (Коротко для Элементы изображения ), где каждый пиксель представляет собой только один цвет. Более того, сотни тысяч пикселей объединяются вместе, чтобы сформировать изображение (например, изображение с разрешением 480 * 640 имеет 307 200 пикселей). В Python пиксель может быть представлен структурой данных, называемой как список . Для представления пикселя нам нужно иметь список хранения трех значений, красных, зеленых и синих или [R, G, B], потому что комбинация цветов, красный, зеленый и синий может представлять любой цвет и значение красного цвета, зеленый & Blue варьируется от 0 до 255 лет.

Итак, какой список?

Список представляет собой структуру данных в Python, которая просто похожа на массив на других языках программирования, такими как C, C ++, … и т. Д., С помощью основной разницы в том, что массив может хранить только переменные и/или константы одинакового типа данных, в то же время. Можно хранить константы и/или переменные нескольких типов данных. INT ArrayName [] = {1,2,3,4}//Массив в C/C ++ int arrayname [] = {1,2, "asxyzp"}//неправильно - массив в C/C ++ не может хранить переменные/константы неоднородных вместе listname = [1,2, «ASXYP»] #possible в Python

Здесь Хороший ресурс в списках в Python от GeeksForGeeks.

Что такое openc?

OpenCV (CV в OpenCV относится к «компьютерному видению») – это библиотека функций, которые позволяют компьютерам обрабатывать и получить понимание высокого уровня цифровых видео или изображений в режиме реального времени.

Вызов № 1.

Теперь первый большой вызов для меня был в Захватите изображение, используя веб-камеру моего ноутбука и хранение изображения Это может быть достигнуто очень легко, используя OpenCV Видеокаптир Класс: Импорт CV2 #iMports OpenCV Библиотека в программе .Videocapture (0)

В приведенном выше коде Фотообь это объект, который хранит захваченное изображение. Чтобы преобразовать объект в Numpy Array (который похож на список), мы должны использовать функцию Читать () Что будет генерировать кортеж (который также похож на список, но это элементы – это нематериальные ), что будет содержать два значения, первое значение, являющееся логическим значением, которое будет правдой, если изображение было исправлено правильно и Ложь, если нет. Второе значение будет небольшой массивом (который также похож на список), который будет хранить значения [R, G, B] пикселей. Параметр, 0, в видеокаптирке () говорит компьютеру снимать изображение с первичной камеры устройства, иначе мы также можем использовать параметр 1, который сообщает компьютеру сделать изображение с вторичной камеры устройства. .читать () Если фотоцепл [0]: [1] остальное: Печать («Изображение не было поймано правильно»)

Теперь осталось только один шаг, который должен написать изображение, и это может быть достигнуто путем функции OpenCV Imwrite (), которая принимает два параметра, первое – это имя файла с типом файла (например, asxyzp.jpeg) и Второе существует Numpy Array, который хранит изображение. [1] cv2.imwrite ("как xyzp.jpg", фоторамка)

И мы сделаем с нашей первой проблемой. Вот вывод нашей первой программы: Не очень счастлив меня .

Задача № 2.

После завершения первой проблемы я получил некоторые основные идеи о том, какие изображения и пиксели являются и как захватывать изображение с использованием библиотеки OpenCV в языке программирования Python. Затем я получил представление о простом эксперименте с созданием псевдослучайное изображение , или изображение, в котором красные, зеленые и синие значения пикселя являются псевдо-случайно выбраны из чисел между 0 и 255.

Итак, Как мы можем выбрать целое число между 0 и 255 псевдослучайно в Python? Это может быть достигнуто на Python’s «Случайные» Модуль, который имеет функцию под названием Randint (начать, конец) . Импорт случайных Def GeneraterAndompixel (): .randint (0,255) .randint (0,255) .randint (0,255)

Один раз, это сделано, мы должны создать строку, которая будет хранить n пикселей (для изображения с разрешением m * n), и тогда мы должны генерировать m таких строк пикселей (для изображения с разрешением m * n). Вывод программы будет список, который бы хотел: [[R11, G11, B11], ..., [R1N, G1N, B1N]], ..., [[RM1, GM1, BM1], ..., [RMN, GMN, BMN]]]]

Поскольку у нас есть вывод списка (как указано выше), мы должны преобразовать этот список в Numpy Array, который, как я уже сказал ранее, довольно похоже на структуру данных списка Python, но это преобразование все еще требуется, потому что imwrite () Функция библиотеки OPENCV может принимать только Numpy Array для изображения и списка для преобразования массива Numpy, можно сделать: Импорт numpy numpy.asarray (listname) # Список #Converts для Numpy Array

Как только мы сделаем с этим, мы просто должны использовать функцию CV2.IMWRITE (). Вывод программы будет:

Кроме того, я проделал еще один эксперимент, но вместо целых чисел между 0 и 255, я выбрал основные целые числа между 0 и 255, но вывод был очень похожим на вышеуказанные.

Вызов 3

После того, как я был сделан с псевдослучайными изображениями, мне было любопытно, действительно ли псевдослучайное изображение действительно случайно или нет, поэтому я решил построить Частота плоттера для пикселей. Если изображение случайно, то он генерирует прямую линию. Программа была относительно проста для создания, но потребовалось немного дольше для программирования. Чтобы это произошло, я должен был использовать Матплотлиб библиотека.

Чтобы построить точки на графике, используя matplotlib, нам нужны два списка, Countarr , который бы в основном хранит целые числа от 1 до общего количества «уникальных пикселей» на изображении + 1, и другая переменная будет Pixfrq , который в основном будет хранить частоту каждого уникального пикселя, соответствующего целому числу Countarr Отказ Здесь Countarr Содержит значение X-AXIS & Pixfrq Содержит значение оси Y. После того, как у нас есть оба списка, нам нужно сделать следующее, чтобы построить график: Импорт matplotlib.pyplot как PLT plt.plot (counterar, pixfrq, 'k' ') #k означает цвет *. обозначает точку PLT.XLABEL («Значения пикселей») #swows Metal для оси X PLT.YLABEL («Частота») # Ярлык для оси Y plt.show () #plots график Выход программы для псевдослучайного изображения: Итак, вывод оказался прямой линией.

Кроме того, я также нанесен вывод программы для первого вывода, asxyzp.jpeg: вышеуказанный участок показывает огромное избыточность пикселей на изображении.

Вызов 4

Следующая идея, которая на мой взгляд, должна была сделать Матричные операции По значениям пикселей изображения, просто для удовольствия. Но проблема в выполнении матричных операций на пикселях заключается в том, что матричные операции могут быть выполнены на целых числах или поплавках, но не в списке, поэтому нам нужно было сделать композицию списка в целое число, так что целое число могло быть разложен в список Отказ Изначально я был смущен, поэтому я попросил помощи на Математика Стек Обмен И позже понял, что я искал, был оператор Left Shift & Right-Shift, и это то, как это можно сделать:

  • Перемещение N битов слева эквивалентно умножить с 2 ^ (n)
  • Переключение N битов справа эквивалентно//ing с 2 ^ (n)

Для состава: Пиксель для целочисленного преобразования [0] << 16 + PIX [1] << 8 + PIX [2] Для разложения: Целое число для преобразования пикселей >> 16 - R << 16 >> 8 - G << 8

Таким образом, мы можем преобразовать список/Numpy массив пикселей в список, представляющих матрицу. Хотя я не продвинулся с моим экспериментами с матричными операциями на изображениях, но вышеупомянутые эксперименты дали мне фундаментальные идеи о том, как действовать с матричными операциями.

Вызов 5.

Теперь я переехал на что-то очень распространенное и менее «экспериментально»: Цветное изображение для преобразования изображения в оттенках серого Отказ Перед чтением о снимках серого, я использовал (ошибочно) думать, что черно-белые изображения в основном, в основном изображения в оттенках серого, но я ошибался. Изображения в середине серого – это изображения, где каждый пиксель изображения представляет интенсивность пикселей, которая варьируется от 0 (Черный) до 255 (белый). Также при поиске изображений Greyscale я узнал о том, что человеческий глаз воспринимает разные интенсивностей цвета по-разному, и это привело к созданию кодирования LUMA: .3 * красный + 0,59 * зеленый + 0,11 * синий Но вместо люма-кодирования мы также можем использовать рекомендацию МСЭ-R BT.709, для более точного представления воспринимаемых изображений: .2126 * красный + 0,7152 * зеленый + 0,0722 * синий Вывод, когда asxyzp.jpeg это вход:

Вызов 6.

Следующая вещь, которую я хотел сделать, это Greyscale для бинарного/черно-белого образа преобразования изображения . Я не знал, как это сделать, поэтому я пытался два разных алгоритма для того же:

Алгоритм 1 :

Алгоритм 2 : Вполне похожее на алгоритм 1, но с единственной разницей, что значение 127 заменяется средней интенсивностью пикселей всех пикселей.

Недовольственным с обоих выходов я начал поиск правильного решения и осуществленный То, что я пытался сделать, называется пороговым значением, способ выбрать пороговое значение, ниже которого значение пикселя будет [0,0,0], а выше, которое будет значение пикселя [255,255,255].

Большое спасибо за прочтение этой статьи. Вы можете найти код и его вывод, здесь Отказ Кроме того, вы можете следовать за мной на Twitter Отказ

Оригинал: “https://dev.to/asxyzp/starting-out-with-images-4nb3”