Как обновить массив numpy на основе координат - PullRequest
0 голосов
/ 19 октября 2019

У меня есть изображение, показанное ниже, которое я пытаюсь преобразовать в двоичное изображение.

Чтобы преобразовать это изображение в двоичное изображение, я сделал:

image[image > 0] = 255

Это создает двоичное изображение с цветной областью, имеющей только белые пиксели. Но я также хочу преобразовать пиксели, которые находятся над цветной областью, в значение 255. Как я могу это сделать? Я хочу не только преобразовать цветные пиксели в белый, но и область над ним. Могу ли я сделать это? Область, обозначенная стрелками, останется черной (т. Е. Область после цветной области)

enter image description here

ОБНОВЛЕНИЕ Кроме того, как я могу приблизитьсяесли края, как показано ниже:

enter image description here

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Если я правильно понял вашу проблему, для достижения желаемого результата следует использовать более сложный подход.

Прежде всего, подход к использованию простого порога создает шумный подход.

Iиспользовал измененное изображение вашего образца:
enter image description here

Если вы примените пороговое значение, то может получиться такой результат:
enter image description here

Здесь может быть полезна более тонкая пороговая настройка:

image3 = cv2.inRange(image, np.array([10, 10, 10]), np.array([255, 255, 255]))

, которая в результате создает двоичное изображение (напоминает желаемый вывод, за исключением верхней полосы):
enter image description here

Чтобы избавиться от полосы, я бы (хотя это просто не идеальный подход) использовал бы что-то, чтобы найти угол, созданный белой областью, а затем использовал его, чтобы нарисовать всеобласть над ним с черным:

ind = np.where(image3 == 255)
max_x = np.max(ind[1])
max_y = ind[0][np.argmax(ind[1])]
image3[:max_y, :max_x] = 255

И результат будет таким:
enter image description here

1 голос
/ 20 октября 2019

Конечно, это не идеальный ответ. Но это может быть чем-то полезным.

Я воссоздаю изображение следующим образом:

test image

Затем я прочитал его и пошел по твоему пути ссначала сделать его двоичным (с небольшой модификацией, чтобы уменьшить шумы):

import numpy as np
from matplotlib import pyplot as plt

img = plt.imread("sample.jpg")
img2 = img.copy()
img2[img2.sum(-1) > 30] = 255
img2[img2.sum(-1) <= 30] = 0

Вот результат после этой модификации:

figure one

ВАРИАНТ 1

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

i, j = np.where(img2.sum(-1) > 0) # find all white coordinates
i, j = (i[j.argmax()], j[j.argmax()]) # the corner white point into the black
img2[:i, :j] = 255 # paint whine all the left-above rectangle from this point

Вот окончательный результат:

the final graph

Это несовершенное, но довольно простое чисто решение для кучи.

ОПЦИЯ 2

В этом решении нам понадобится простое исчисление и линейная алгебра. Возьмите две точки в 2D-пространстве и проведите линию между ними. Итак, какова функция границы?

point2 = (i, j) # same i and j from OPTION1 (coordinates of the top-right corner)
point1 = (img2.shape[0], img2[-1].sum(-1).argmin()) # the bottom-right white corner.

a = (point2[1] - point1[1]) / (point2[0] - point1[0])
c = point1[1] - a * point1[0]
f = lambda x: int(a * x + c)

Теперь нарисуйте все области слева от линии:

for i in range(img2.shape[0]):
    img2[:i, :f(i)+1] = 255

Вот результат: enter image description here

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