Разделение изображения на сетку (скажем, 3х3) и извлечение значения пикселя для каждой области сетки - PullRequest
2 голосов
/ 30 сентября 2019

Привет. Я пытаюсь обработать набор изображений (скажем, 5). Я хочу, чтобы каждое изображение рассматривалось как слой, который разделен на сетку 3х3, где каждая область сетки представляет пиксель. Я хочу получить максимум значений пикселей для каждого слоя (изображения) и создать окончательное изображение с максимальными значениями пикселей для каждого слоя. Сейчас я только что попытался нарисовать сетку на одном изображении, но я не думаю, что это правильный подход. Любые предложения о том, как получить желаемое решение.

plt.figure(figsize=(20,20))
y_start= im1.height
y_end= 0
x= 100
for x in range(0,im1.width,50):
    line= ((x,y_start),(x,y_end))
    draw =ImageDraw.Draw(im1)
    draw.line(line,fill=('white'))
plt.imshow(im1)

plt.figure(figsize=(20,20))
x_start= 0
x_end= im1.height

for y in range(0,im1.height,50):
    line= ((x_start,y),(x_end,y))
    draw =ImageDraw.Draw(im1)
    draw.line(line,fill=('white'))
plt.imshow(im1)

pix_val = list(im1.getdata())

1 Ответ

1 голос
/ 30 сентября 2019

Позже я поработаю над решением на Python, но вы можете приступить к работе с ImageMagick , который установлен на большинстве дистрибутивов Linux и доступен для macOS и Windows.

Просто в терминалеили (Командная строка в Windows) вы можете получить максимум области 3x3, например:

magick input.png -statistic maximum 3x3 result.png

Затем, если вы загрузите последовательность изображений, вы можете получить максимум всех окон 3x3 вкаждый из них похож на это, предполагая, что ваши файлы называются 1.png, 2.png ...:

magick [12345].png -statistic maximum 3x3 -evaluate-sequence max result.png

Если ваши файлы имеют разные имена, вам, возможно, придется перечислить их:

magick base_layer.png layer1.png important_layer.png ... statistic maximum 3x3 -evaluate-sequence max result.png

Если вы используете ImageMagick версии 6 или старше, вам нужно будет использовать convert вместо magick в вышеприведенных командах.


С OpenCV вам нужно будет вызвать cv2.dilate(), чтобы получить максимум окна 3x3 на каждом слое, а затем, вероятно, позвонить numpy.maximum.reduce(), чтобы получить максимум для получающихся слоев, см. этот ответ .

Расширение выглядит так:

import cv2
import numpy as np

# Make 3x3 structuring element for dilation
kernel  = np.ones((3,3),np.uint8)

im = cv2.imread('1.png')
dilated = cv2.dilate(im, kernel, iterations=1)
...