Как получить координаты пикселя python

Обновлено: 08.07.2024

python-Numpy Learning (5) работа с пикселями изображения

python-Numpy Learning (5) работа с пикселями изображения

После того, как изображение считывается в программу, оно существует как массив numpy. Следовательно, все функции массивов numpy применимы и к изображениям. Доступ к элементам массива - это фактически доступ к пикселям изображения.

Метод доступа к цветному изображению:

i представляет количество строк изображения, j представляет количество столбцов изображения, а c представляет количество каналов изображения (каналы RGB соответствуют 0, 1, 2 соответственно). Координаты указаны в верхнем левом углу.

Метод доступа к полутоновым изображениям:

Пример 1: вывести значение пикселей 20-й строки и 30-го столбца в канале G изображения котенка.

Пример 2: Отображение красного одноканального изображения


Помимо чтения пикселей, вы также можете изменять значения пикселей.

Пример 3: случайным образом добавьте соль и перец на фотографии котят


Random в пакете numpy используется для генерации случайных чисел. Randint (0, cols) означает случайное генерирование целого числа в диапазоне от 0 до cols.

Используйте предложение img [x, y,:] = 255, чтобы изменить значение пикселя и изменить исходное трехканальное значение пикселя на 255.

Обрезая массив, изображение можно обрезать.

Пример 4. Обрезать изображение котенка.


Работайте с несколькими пикселями и используйте доступ к фрагменту массива. Метод нарезки возвращает значение пикселя массива с указанным индексом интервала. Вот несколько примеров изображений в градациях серого:

Наконец, мы рассмотрим два примера доступа и изменения значений пикселей:

Пример 5: преобразовать изображение lena в бинаризацию, значение пикселя больше 128 становится 1, в противном случае оно становится 0

Примечание: изображение lena (), которое поставляется с python, может быть непригодным для использования, вы можете подготовить изображение самостоятельно.


В этом примере функция цветового модуля rgb2gray () используется для преобразования цветного трехканального изображения в изображение в оттенках серого. Результатом преобразования является массив типа float64 с диапазоном значений [0,1].

Пример 6:


В этом примере сначала оцениваются все значения пикселей канала R. Если оно больше 170, значение пикселя в этом месте изменяется на [0,255,0], то есть значение канала G равно 255, а значения каналов R и B равны 0.

Интеллектуальная рекомендация

Поверните строку в целые числа

Тема Описание Преобразуйте строку в целое число (реализация функции integer.valueof (строка), но строка не совпадает 0), требуя функции библиотеки, которая нельзя использовать для преобразования целых.

Docker создает репликацию Redis Master-Slave

Centos установить докер быстрый старт докера Создать Dockerfile Поместите файл на сервер Linux, создайте папку / usr / docker / redis и поместите его в этот каталог Выполните следующий код в каталоге .


Установка GateOne на новом CentOS7

Установка GateOne на новом CentOS7 В последнее время исследуются такие инструменты, как WebSSH2, в настоящее время требуется встроить терминал ssh в веб-приложение и найти GateOne. GateOne - это веб-в.


Примечания к исследованию Qt4 (5), QWaitCondition of QThread Learning


Практические занятия: решения проблем системы управления обучением

Сразу после получения задания будет много трудностей и много проблем. Хорошо иметь проблему, а это значит, что вы можете получить новые знания. Неважно, есть ли проблемы, ключ в том, как их решить. пр.

Вам также может понравиться


искробезопасная практика (5) обратный индекс

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


Решение центра тяжести неправильного многоугольника

Справочник статей Во-первых, решение центра тяжести неправильных многоугольников 1.1 Метод расчета треугольника центра тяжести 1.2 Метод расчета площади треугольника 1.3 Метод расчета площади полигона.

изменение цвета пикселя в изображении. Библиотека PIL Python

В прошлой статье мы узнали как установить библиотеку PIL в Python и начать уже с ней работать. В этой статье мы продолжаем изучение библиотеки PIL. Начиная с версией 1.1.6 метод load() возвращает объект, с помощью которого можно получить доступ к отдельным пикселям изображения. Указав два значения внутри квадратных скобок, можно получить или задать цвет пикселя.

Для доступа к отдельному пикселю вместо метода load() можно использовать методы getpixel() и putpixel(). Метод getpixel(<Координаты>) позволяет получить цвет указанного пикселя, а метод putpixel(<Координаты>, <Цвет>) изменяет цвет пикселя. Координаты пикселя указываются в виде кортежа из двух элементов. Необходимо заметить, что эти методы работают медленнее метода load(). Пример использования метода getpixel() и putpixel() приведен ниже.

Использование метода getpixel() и putpixel()

В этом примере для просмотра изображения мы воспользовались методом show(). Метод show() создает временный файл в формате BMP и запускает программу для просмотра изображения, используемую в операционной системе по умолчанию. Например, на моем компьютере запускается программа ACDSee. Для сохранения изображения в файл предназначен метод save().

В первом параметре указывается абсолютный или относительный путь. Вместо пути можно передать файловый объект, открытый в бинарном режиме. Сохраним изображение в форматах JPEG и BMP разными способами.

Сохраняем изображение в Python

Обратите внимание на то, что мы открыли файл в формате JPEG, а сохранили его в формате BMP. Таким образом, можно открывать изображения в одном формате и конвертировать его в другой формат. Если сохранить изображение не удалось, возбуждается исключение IOError. Если параметр <Формат> не указан, то формат изображения определяется по расширению файла.

В параметре <Обции> можно указать дополнительный характеристики изображения. Поддерживаемый опции зависят от формата изображения. Например, по умолчанию изображения в формате JPEG сохраняются с качеством 75. С помощью опции quality можно указать другое значение в диапазоне от 1 до 100.

За дополнительной информации по опциям обращайтесь к документации. Так же для более подробной инструкции игры в покер можете прочитать poker правила и повысить свои навыки в этой игре. Удивите своих знакомых во время игры в покер, продемонстрировав им свой профессионализм игры.


Я действительно новичок в Python и хотел бы знать, есть ли быстрый способ получить значения ячеек растрового пикселя за пикселем и координаты (координаты X Y центра каждого пикселя) с помощью Python в ArcGIS 10?

Чтобы описать это дальше, мне нужно получить карту X, карту Y и значение ячейки первого пикселя, присвоить эти три значения трем переменным и повторить этот шаг для остальных пикселей (пройти через весь растр).

Думаю, мне нужно подробнее описать свой вопрос. Проблема в том, что мне нужно получить местоположение X Y пикселя первого растра и получить значения ячеек нескольких других растров, соответствующие этому местоположению X Y. Этот процесс должен проходить через каждый пиксель первого растра без создания какого-либо шейп-файла с промежуточными точками, так как это действительно займет много времени, поскольку мне нужно обрабатывать растр с почти 8 миллиардами пикселей. Также мне нужно сделать это с помощью Python в ArcGIS 10.

@JamesS: Большое спасибо за ваше предложение. Да, это сработает для одного растра, но мне нужно собрать значения ячеек и для нескольких других растров. Проблема в том, что после получения координат X и Y первого пикселя первого растра мне нужно получить значение ячейки второго растра, соответствующее этому местоположению X, Y первого растра, затем третьего растра и так далее. Итак, я думаю, что при циклическом просмотре первого растра получение местоположения пикселя по X и Y и получение значений ячеек другого растра, соответствующего этому местоположению, должно выполняться одновременно, но я не уверен. Это можно сделать, преобразовав первый растр в точечный шейп-файл и выполнив Извлечение многозначных значений в точечную функцию в ArcGIS 10, но я не могу следовать этому методу, потому что я не хочу создавать шейп-файл, поскольку он действительно будет медленно, и мне нужно найти решение, используя PYTHON, а не какой-либо существующий инструмент в ArcGIS.

@hmfly: Спасибо, да, этот метод (RastertoNumpyarray) будет работать, если я смогу получить координаты известного значения строки и столбца массива.

@whuber: я не хочу выполнять какие-либо вычисления, все, что мне нужно сделать, это записать координаты X Y и значения ячеек в текстовый файл и все.

  • Может быть, вы просто хотите посчитать весь растр? Калькуляторы растра работают попиксельно.
  • 1 опишите, пожалуйста, вашу цель более подробно.
  • Обычно эффективные и надежные решения получаются с помощью операций алгебры карт, а не цикла по точкам. Ограничения в реализации алгебры карт Spatial Analyst не позволяют этому подходу работать в каждом случае, но в удивительно большом количестве ситуаций вам не нужно кодировать цикл. Какой именно расчет нужно произвести?
  • Повторите редактирование: конечно, это законная цель. Формат может быть навязан вам потребностями программного обеспечения в дальнейшем. Но учитывая, что для записи 8 миллиардов (X, Y, value1, . value3) кортежей потребуется от 224 миллиардов байтов (в двоичном формате) до, возможно, 400 миллиардов байтов (в ASCII), любой из которых является довольно большим набором данных, Возможно, стоит найти альтернативные подходы к тому, чего вы в конечном итоге пытаетесь достичь!

Следуя идее @Dango, я создал и протестировал (на небольших растрах с одинаковым размером и размером ячейки) следующий код:

На основе кода @hmfly вы можете получить доступ к желаемым значениям:

arcpy.RasterToNumPyArray Метод позволяет указать подмножество растра, преобразованного в массив NumPy (справочная страница ArcGIS10), что может быть полезно при разбиении большого набора данных на подматрицы.

  • Код Марцина супер! спасибо, но он не записывает X, Y растра с таким же разрешением растра, я имею в виду, что x и y растут на 1 м, а не, например) 100 метров . У вас есть предложение по исправлению это спасибо

Самый простой способ вывести координаты и значения ячеек в текстовый файл в ArcGIS 10 - это функция-образец, не требующая кода и, особенно, без необходимости перебирать каждую ячейку. В калькуляторе растра ArcGIS outfile.csv = sample(someraster) который выведет текстовый файл со всеми (ненулевыми) значениями ячеек и координатами (в формате z, x, y). В ArcGIS 10, похоже, что аргумент in_location_data теперь является обязательным, поэтому вам нужно использовать синтаксис Sample(someraster, someraster, outcsvfile) .

Изменить: вы также можете указать несколько растров: Sample([someraster, anotherraster, etc], someraster, outcsvfile) . Сработает ли это на 8 миллиардах ячеек, я понятия не имею .

Простое решение с использованием пакетов Python с открытым исходным кодом:

Fiona удобна тем, что вы можете открыть шейп-файл, перебирать функции и (как и я) добавлять их в dict объект. Действительно Фиона feature сам по себе как dict а также, чтобы легко получить доступ к свойствам. Если бы у моих точек были какие-либо атрибуты, они бы появились в этом слове вместе с координатами, идентификатором и т. Д.

Rasterio удобен тем, что его легко читать в растре как массив, легкий и быстрый тип данных. У нас также есть доступ к dict свойств растра, включая affine , это все данные, необходимые для преобразования координат x, y растра в координаты row, col. См. Отличное объяснение @perrygeo здесь.

В итоге мы получаем pt_data типа dict в котором есть данные для каждой точки и извлеченные raster_value . Мы могли бы легко переписать шейп-файл с извлеченными данными, если бы захотели.

Привет, Хабр! Запускаю цикл статей по библиотеке OpenCV в Python. Кому интересно, добро пожаловать под кат!

my_logo

Введение

OpenCV — это open source библиотека компьютерного зрения, которая предназначена для анализа, классификации и обработки изображений. Широко используется в таких языках как C, C++, Python и Java.

Установка

Будем считать, что Python и библиотека OpenCV у вас уже установлены, если нет, то вот инструкция для установки python на windows и на ubuntu, установка OpenCV на windows и на ubuntu.

Немного про пиксели и цветовые пространства

Перед тем как перейти к практике, нам нужно разобраться немного с теорией. Каждое изображение состоит из набора пикселей. Пиксель — это строительный блок изображения. Если представить изображение в виде сетки, то каждый квадрат в сетке содержит один пиксель, где точке с координатой ( 0, 0 ) соответствует верхний левый угол изображения. К примеру, представим, что у нас есть изображение с разрешением 400x300 пикселей. Это означает, что наша сетка состоит из 400 строк и 300 столбцов. В совокупности в нашем изображении есть 400*300 = 120000 пикселей.

В большинстве изображений пиксели представлены двумя способами: в оттенках серого и в цветовом пространстве RGB. В изображениях в оттенках серого каждый пиксель имеет значение между 0 и 255, где 0 соответствует чёрному, а 255 соответствует белому. А значения между 0 и 255 принимают различные оттенки серого, где значения ближе к 0 более тёмные, а значения ближе к 255 более светлые:

4850884 91136851 P7DI0Ak0 greyscalesteps0255

Импорт библиотеки OpenCV

Теперь перейдём к практической части. Первое, что нам необходимо сделать — это импортировать библиотеку. Есть несколько путей импорта, самый распространённый — это использовать выражение:

Также можно встретить следующую конструкцию для импорта данной библиотеки:

Загрузка, отображение и сохранение изображения

Для загрузки изображения мы используем функцию cv2.imread(), где первым аргументом указывается путь к изображению, а вторым аргументом, который является необязательным, мы указываем, в каком цветовом пространстве мы хотим считать наше изображение. Чтобы считать изображение в RGB — cv2.IMREAD_COLOR, в оттенках серого — cv2.IMREAD_GRAYSCALE. По умолчанию данный аргумент принимает значение cv2.IMREAD_COLOR. Данная функция возвращает 2D (для изображения в оттенках серого) либо 3D (для цветного изображения) массив NumPy. Форма массива для цветного изображения: высота x ширина x 3, где 3 — это байты, по одному байту на каждую из компонент. В изображениях в оттенках серого всё немного проще: высота x ширина.

С помощью функции cv2.imshow() мы отображаем изображение на нашем экране. В качестве первого аргумента мы передаём функции название нашего окна, а вторым аргументом изображение, которое мы загрузили с диска, однако, если мы далее не укажем функцию cv2.waitKey(), то изображение моментально закроется. Данная функция останавливает выполнение программы до нажатия клавиши, которую нужно передать первым аргументом. Для того, чтобы любая клавиша была засчитана передаётся 0. Слева представлено изображение в оттенках серого, а справа в формате RGB:

concatenate_two_girl

И, наконец, с помощью функции cv2.imwrite() записываем изображение в файл в формате jpg(данная библиотека поддерживает все популярные форматы изображений:png, tiff,jpeg,bmp и т. д., поэтому можно было сохранить наше изображение в любом из этих форматов), где первым аргументом передаётся непосредственно само название и расширение, а следующим параметром изображение, которое мы хотим сохранить.

Доступ к пикселям и манипулирование ими

Для того, чтобы узнать высоту, ширину и количество каналов у изображения можно использовать атрибут shape:

Важно помнить, что у изображений в оттенках серого img.shape[2] будет недоступно, так как данные изображения представлены в виде 2D массива.

Чтобы получить доступ к значению пикселя, нам просто нужно указать координаты x и y пикселя, который нас интересует. Также важно помнить, что библиотека OpenCV хранит каналы формата RGB в обратном порядке, в то время как мы думаем в терминах красного, зеленого и синего, то OpenCV хранит их в порядке синего, зеленого и красного цветов:

Cначала мы берём пиксель, который расположен в точке (0,0). Данный пиксель, да и любой другой пиксель, представлены в виде кортежа. Заметьте, что название переменных расположены в порядке b, g и r. В следующей строке выводим значение каждого канала на экран. Как можно увидеть, доступ к значениям пикселей довольно прост, также просто можно и манипулировать значениями пикселей:

В первой строке мы устанавливаем значение пикселя (0, 0) равным (255, 0, 0), затем мы снова берём значение данного пикселя и выводим его на экран, в результате мне на консоль вывелось следующее:

На этом у нас конец первой части. Если вдруг кому-то нужен исходный код и картинка, то вот ссылка на github. Всем спасибо за внимание!

Читайте также: