Данное назад я начал путешествие в информатике с Программа 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”