Заменить значения пикселей в изображении Numpy

У меня есть изображение с нулями размером 720 * 1280, и у меня есть список координат пикселей для изменения:

x = [623, 623, 583, 526, 571, 669, 686, 697, 600, 594, 606, 657, 657, 657, 617, 646, 611, 657, 674, 571, 693, 688, 698, 700, 686, 687, 687, 693, 690, 686, 694]

y = [231, 281, 270, 270, 202, 287, 366, 428, 422, 517, 608, 422, 518, 608, 208, 214, 208, 231, 653, 652, 436, 441, 457, 457, 453, 461, 467, 469, 475, 477, 467] 

вот график разброса:

yy= [720 -x for x in y]
plt.scatter(x, yy, s = 25, c = "r")
plt.xlabel('x')
plt.ylabel('y')
plt.xlim(0, 1280)
plt.ylim(0, 720)
plt.show()

введите здесь описание изображения

вот код для создания двоичного изображения, установив значение пикселя на 255

image_zeros = np.zeros((720, 1280), dtype=np.uint8)
    for i ,j in zip (x, y):
            image_zeros[i, j] = 255

    plt.imshow(image_zeros, cmap='gray')
    plt.show()

вот результат: в чем проблема!!

введите здесь описание изображения


person BetterEnglish    schedule 19.08.2018    source источник
comment
@unutbu, это не работает. не могли бы вы сгенерировать результат? пожалуйста   -  person BetterEnglish    schedule 19.08.2018
comment
Разрешение - это проблема. Ширина графика меньше 1280x720 пикселей, поэтому вы не можете видеть все значения в массиве.   -  person Stop harming Monica    schedule 19.08.2018
comment
@Goyo, я не понял, что ты имеешь в виду. Вы имеете в виду, что мы не можем показать такое разрешение изображения с помощью plt.imshow()?   -  person BetterEnglish    schedule 19.08.2018
comment
Вы можете показывать любое разрешение с помощью imshow, если ваше устройство вывода поддерживает его. Но вы не можете показывать значения 1280x720 на картинке 378x223.   -  person Stop harming Monica    schedule 19.08.2018


Ответы (1)


Как указал Гойо, разрешение изображения это проблема. Размер рисунка по умолчанию составляет 6,4 дюйма на 4,8 дюйма, а разрешение по умолчанию — 100 точек на дюйм (по крайней мере, для текущей версии matplotlib). Таким образом, размер изображения по умолчанию составляет 640 x 480. Рисунок включает не только изображение imshow, но также метки, метки, оси x и y и белую рамку. Таким образом, по умолчанию для изображения imshow доступно даже меньше 640 x 480 пикселей.

Ваш image_zeros имеет форму (720, 1280). Массив слишком велик для полной визуализации в изображении размером 640 x 480 пикселей.

Таким образом, чтобы сгенерировать белые точки с помощью imshow, установите figsize и dpi так, чтобы количество пикселей, доступных для изображения imshow, было больше (1280, 720):

import numpy as np
import matplotlib.pyplot as plt

x = np.array([623, 623, 583, 526, 571, 669, 686, 697, 600, 594, 606, 657, 657, 657, 617, 646, 611, 657, 674, 571, 693, 688, 698, 700, 686, 687, 687, 693, 690, 686, 694])
y = np.array([231, 281, 270, 270, 202, 287, 366, 428, 422, 517, 608, 422, 518, 608, 208, 214, 208, 231, 653, 652, 436, 441, 457, 457, 453, 461, 467, 469, 475, 477, 467])

image_zeros = np.zeros((720, 1280), dtype=np.uint8)
image_zeros[y, x] = 255

fig, ax = plt.subplots(figsize=(26, 16), dpi=100)
ax.imshow(image_zeros, cmap='gray', origin='lower')
fig.savefig('/tmp/out.png')

Вот крупный план, показывающий некоторые из белых точек:

введите здесь описание изображения

Чтобы белые точки было легче увидеть, вы можете использовать scatter вместо imshow:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([623, 623, 583, 526, 571, 669, 686, 697, 600, 594, 606, 657, 657, 657, 617, 646, 611, 657, 674, 571, 693, 688, 698, 700, 686, 687, 687, 693, 690, 686, 694])
y = np.array([231, 281, 270, 270, 202, 287, 366, 428, 422, 517, 608, 422, 518, 608, 208, 214, 208, 231, 653, 652, 436, 441, 457, 457, 453, 461, 467, 469, 475, 477, 467])
yy = 720 - y

fig, ax = plt.subplots()

ax.patch.set_facecolor('black')
ax.scatter(x, yy, s=25, c='white')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_xlim(0, 1280)
ax.set_ylim(0, 720)
fig.savefig('/tmp/out-scatter.png')

введите здесь описание изображения

person unutbu    schedule 19.08.2018