Как заставить мой код определить разницу между 2 кружками (2 кружка, один из которых заполнен белым, а другой - черным), используя python и подушку? - PullRequest
1 голос
/ 15 июня 2019

У меня 2 изображения,

1- Белый круг с черным штрихом

2- Черный круг с черным штрихом

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

Я уже пробовал несколько методов, таких как Edge Detection, но всякий раз, когда я пытаюсь изменить изображение для обнаружения края, новое изображение отображается как пустое

from PIL import Image, ImageDraw
import numpy as np
from math import sqrt

# Load image:
input_image = Image.open("input.png")
input_pixels = input_image.load()
width, height = input_image.width, input_image.height

# Create output image
output_image = Image.new("RGB", input_image.size)
draw = ImageDraw.Draw(output_image)

# Convert to grayscale
intensity = np.zeros((width, height))
for x in range(width):
    for y in range(height):
        intensity[x, y] = sum(input_pixels[x, y]) / 3

# Compute convolution between intensity and kernels
for x in range(1, input_image.width - 1):
    for y in range(1, input_image.height - 1):
        magx = intensity[x + 1, y] - intensity[x - 1, y]
        magy = intensity[x, y + 1] - intensity[x, y - 1]

        # Draw in black and white the magnitude
        color = int(sqrt(magx**2 + magy**2))
        draw.point((x, y), (color, color, color))

output_image.save("edge.png")

ожидаемый результат, что оба изображения будут окрашены в серый цвет только с кружочками, отмеченными белым

фактический результат пустое черное изображение (как будто оно не может видеть края)

1 Ответ

2 голосов
/ 15 июня 2019

Что ж, если все, что вам нужно, это обнаружение краев на изображении, то вы можете попробовать использовать Оператор Собеля или его эквиваленты.

from PIL import Image, ImageFilter

image = Image.open(r"Circle.png").convert("RGB")
image = image.filter(ImageFilter.FIND_EDGES)
image.save(r"ED_Circle.png")

Приведенный выше код принимает входное изображение и преобразует его в режим RGB (некоторые изображения имеют режим P, который не позволяет распознавать края, поэтому преобразуется в RGB). Затем находит ребра в нем через image.filter(ImageFilter.FIND_EDGES).

Пример входного изображения (черная рамка с черным кружком): -

enter image description here

Вывод после обработки через программу python: -

enter image description here

Образец изображения 2 (белый кружок с черной рамкой): -

enter image description here

Вывод после обработки через программу python: -

enter image description here

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

Поскольку круги были одинакового размера, их прохождение через процесс обнаружения ребер дало нам те же результаты.

Примечание: -

  • В вопросе вы хотели, чтобы края круга были белыми, а остальные часть в оттенках серого. Который не лучший выбор для обнаружения края. Белый и черный обратны друг другу, поэтому края могут быть легко определить, если пробное пространство изображения состоит из этих два цвета. Даже тогда, если вы хотите использовать оттенки серого вместо черного, вы можете просто заменить каждый черный пиксель изображения на серый или что-то, что соответствует вашим потребностям
  • Результаты вышеупомянутого обнаружения края одинаковы, потому что размер граница незначительна. Если граница шире (штрих), то когда процесс делается по белому кругу с черной каймой, по краю обнаружение создаст более одной белой границы. Вы можете пройти через эта проблема, заставляя программу игнорировать внутренние края и только с учетом самых внешних.
...