Как нарисовать точку на изображении, используя заданную координату - PullRequest
4 голосов
/ 06 апреля 2019

Я загрузил изображение и попытался нарисовать красную точку на изображении

img=mpimg.imread('./images/im00001.jpg')
red = [0,0,255]
# Change one pixel
img[ 0.,-26.10911452,0. ]=red
imgplot = plt.imshow(img)

но произошла следующая ошибка

ValueError: назначение назначения доступно только для чтения

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

mpimg означает, что вы используете matplotlib для чтения изображения.

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

  • matplotlib сохраняет данные изображения в массивах Numpy. Итак, type(img) вернет <class 'numpy.ndarray'>. (Ссылка 1)
  • Форма ndarray представляет высоту, ширину и количество полос изображения.
  • Каждый внутренний список представляет пиксель. Для RGBA длина внутреннего списка изображений равна 3. Для RGBA длина внутреннего списка изображений равна 4. Каждое значение списка хранит данные с плавающей запятой в диапазоне от 0,0 до 1,0. Каждое значение представляет значения R (красный), G (зеленый), B (синий) и A (альфа / прозрачность) пикселя.
  • Для изображения RGB, чтобы установить пиксель в красный цвет, необходимо назначить пиксель: [1, 0, 0]
  • Для изображения RGBA, чтобы установить пиксель в красный цвет, необходимо назначить пиксель: [1, 0, 0, 1]
  • В matplotlib размер рисунка фиксирован, а содержимое растягивается / сжимается / интерполируется в соответствии с рисунком. Итак, после сохранения изображения разрешение может измениться. (Ссылка 2)

В соответствии с этими пунктами я отредактировал изображение RGBA (в формате png), поместив красную точку в его центр.

Исходное изображение:

minion.png

Отредактированное изображение:

minion_edited

code.py:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# dpi for the saved figure: https://stackoverflow.com/a/34769840/3129414
dpi = 80

# Set red pixel value for RGB image
red = [1, 0, 0]
img = mpimg.imread("minion.png")
height, width, bands = img.shape

# Update red pixel value for RGBA image
if bands == 4:
    red = [1, 0, 0, 1]

# Update figure size based on image size
figsize = width / float(dpi), height / float(dpi)

# Create a figure of the right size with one axes that takes up the full figure
figure = plt.figure(figsize=figsize)
axes = figure.add_axes([0, 0, 1, 1])

# Hide spines, ticks, etc.
axes.axis('off')

# Draw a red dot at pixel (62,62) to (66, 66)
for i in range(62, 67):
    for j in range(62, 67):
        img[i][j] = red

# Draw the image
axes.imshow(img, interpolation='nearest')

figure.savefig("test.png", dpi=dpi, transparent=True)

Ссылка:

  1. Официальный Matplotlib учебник
  2. Ответ Stackoverflow при сохранении изображения в том же разрешении, что и оригинал изображение
0 голосов
/ 06 апреля 2019

Вы на правильном пути.Вы можете изменить свойство пикселя, используя Numpy-сплайсинг

img[x,y] = [B,G,R]

Так, например, чтобы изменить пиксель на (50,50) на красный, вы можете сделать

img[50,50] = [0,0,255]

Здесь мы меняем одинот пикселя к красному (он довольно маленький)

enter image description here

import cv2
import numpy as np

width = 100
height = 100

# Make empty black image of size (100,100)
img = np.zeros((height, width, 3), np.uint8)

red = [0,0,255]

# Change pixel (50,50) to red
img[50,50] = red

cv2.imshow('img', img)
cv2.waitKey(0)

Альтернативный метод - использовать cv2.circle () длянарисуйте свою точку на месте.

Заголовок функции:

cv2.circle(image, (x, y), radius, (B,G,R), thickness)

Используя это, мы получаем тот же результат

cv2.circle(img, (50,50), 1, red, -1)

enter image description here

...