Как изменить значение серой шкалы региона на изображении? - PullRequest
0 голосов
/ 10 января 2019

Я новичок в Python и не совсем уверен, как решить эту проблему.

Я пытаюсь сделать черно-белое изображение и изменить значение края (толщиной x пикселей) с 255 на другое значение в оттенках серого.

Мне нужно сделать это для набора изображений PNG внутри папки. Все изображения будут геометрическими (в основном это комбинация прямых линий), без сумасшедших кривых или узоров. Использование Python 3.

Пожалуйста, проверьте изображения.

Original 1

Desired 1

Original 2

Desired 2

Типичный файл будет выглядеть так: https://drive.google.com/open?id=13ls1pikNsO7ZbsHatC6cOr4O6Fj0MPOZ

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я могу интерпретировать ваш вопрос намного проще, поэтому я решил, что отвечу и на этот более простой вопрос. Возможно, у вас уже есть серый край вокруг ваших фигур (например, файлы на диске Google, которыми вы поделились), и вы просто хотите изменить все пиксели, которые не являются ни черными, ни белыми, на другой цвет - и тот факт, что они являются краями, не имеет значения. Это намного проще:

#!/usr/bin/env python3

import numpy as np
from PIL import Image

# Open input image and ensure it is greyscale
image = Image.open('XYBase.png').convert('L')

# Make Numpy version
imnp = np.array(image)

# Set all pixels that are neither black nor white to 220
imnp[(imnp>0) & (imnp<255)] = 220

# Convert Numpy image back to PIL image and save
Image.fromarray(imnp).save('result.png')
0 голосов
/ 10 января 2019

Я думаю, это то, что вы хотите. Комментарии должны хорошо объяснить, о чем я говорю:

#!/usr/bin/env python3

import numpy as np
from PIL import Image, ImageFilter
from skimage.morphology import dilation, square

# Open input image and ensure it is greyscale
image = Image.open('XYbase.png').convert('L')

# Find the edges
edges = image.filter(ImageFilter.FIND_EDGES)

# Convert edges to Numpy array and dilate (fatten) with our square structuring element
selem = square(6)
fatedges = dilation(np.array(edges),selem)

# Make Numpy version of our original image and set all fatedges to brightness 128
imnp = np.array(image)
imnp[np.nonzero(fatedges)] = 128

# Convert Numpy image back to PIL image and save
Image.fromarray(imnp).save('result.png')

Итак, если я начну с этого изображения:

enter image description here

(промежуточные) ребра выглядят так:

enter image description here

И я получаю это в результате:

enter image description here


Если вы хотите, чтобы контуры толще / тоньше, увеличьте / уменьшите 6 в:

selem = square(6)

Если вы хотите, чтобы контуры были светлее / темнее, увеличьте / уменьшите 128 in:

imnp[np.nonzero(fatedges)] = 128

Ключевые слова : изображение, обработка изображений, откормить, утолщить, контур, след, край, выделение, Numpy, PIL, Подушка, край, края, морфология, структурирующий элемент, образ магии, scikit-изображение, эрозия , эрозия, расширение, расширение.

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