Как представить двоичное изображение в виде графика с осью, являющейся размерами высоты и ширины, и данными, являющимися пикселями - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь использовать Python вместе с opencv, numpy и matplotlib для создания некоторого компьютерного зрения для робота, который будет использовать перила для навигации.Я в настоящее время чрезвычайно застрял, закончились места, чтобы посмотреть.Мой текущий код:

import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread('railings.jpg')
railing_image = np.copy(image)

resized_image = cv2.resize(railing_image,(881,565))

gray = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
canny = cv2.Canny(blur, 85, 255)

cv2.imshow('test',canny)

image_array = np.array(canny)
ncols, nrows = image_array.shape

count = 0
scan = np.array
for x in range(0,image_array.shape[1]):
    for y in range(0,image_array.shape[0]):
        if image_array[y, x] == 0:
            count += 1
    scan = [scan, count]

print(scan)

plt.plot([0, count])
plt.axis([0, nrows, 0, ncols])
plt.show()

cv2.waitKey(0)

Я использую хитрое изображение, которое хранится в массиве из 1 и 0, изображение, которое мне нужно представить, это

Source image

Окончательный результат должен выглядеть примерно так, как показано на следующем рисунке.

terrible_drawing_of_image

Я пытался использовать функцию гистограммы, но мне удалось только получить ее, чтобы вывести, по существу, количество раз, которое 1или появляется 0.

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

Спасибо

1 Ответ

0 голосов
/ 22 февраля 2019

Я не уверен, насколько это вообще, но вы можете просто использовать numpy argmax, чтобы получить местоположение максимума (например, this ) в вашем случае.Вам следует избегать циклов, так как это будет очень медленно, лучше использовать функции numpy.Я импортировал ваше изображение и использовал критерий обрезки, согласно которому 200 или больше в желтом канале рельсов,

import cv2
import numpy as np
import matplotlib.pyplot as plt

#This loads the canny image you uploaded
image = cv2.imread('uojHJ.jpg')

#Trim off the top taskbar
trimimage = image[100:, :,0]

#Use argmax with 200 cutoff colour in one channel
maxindex = np.argmax(trimimage[:,:]>200, axis=0)

#Plot graph
plt.plot(trimimage.shape[0] - maxindex)
plt.show()

Где это выглядит следующим образом:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...