Рассчитать среднее значение серого для указанных c областей изображения с scikit-image - PullRequest
1 голос
/ 24 февраля 2020

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

Сначала я замаскировал изображение, обработав следующий код:

import numpy as np
import matplotlib as mpl
from matplotlib.path import Path
from matplotlib import patches
import matplotlib.pyplot as plt

import skimage.io as io
from skimage import data_dir 

img = io.imread('/media/rene/Windows8_OS/PROMON/Recorded Sequences/PNG/0rpm_p000.png')

vertices = np.asarray([( 947, 1959),
                       (1762, 1959),
                       (1762, 2241),
                       ( 947, 2241),
                       ( 947, 1089),
                       (1762, 1089),
                       (1762, 1371),
                       ( 947, 1371),
                       ( 947,  797),
                       (1762,  797),
                       (1762, 1079),
                       ( 947, 1079),
                       ( 947,  505),
                       (1762,  505),
                       (1762,  787),
                       ( 947,  787),
                       ( 947,  213),
                       (1762,  213),
                       (1762,  495),
                       ( 947,  495)])

# reshape into smaller path for faster debugging
# vertices = vertices // 20

# matplotlib path
path = Path(vertices)
xmin, ymin, xmax, ymax = np.asarray(path.get_extents(), dtype=int).ravel()

# create a mesh grid of the shape of the final mask
x, y = np.mgrid[:img.shape[1], :img.shape[0]]
# mesh grid to points
points = np.vstack((x.ravel(), y.ravel())).T

# mask for the point included in the path
mask1 = path.contains_points(points)
path_points = points[np.where(mask1)]

# reshape mask for display 
img_mask1 = mask1.reshape(x.shape).T

# selecting all but black pixels
# black_pixels_mask = np.all(img_mask1 == [0, 0, 0], axis=-1)
# non_black_pixels_mask = ~black_pixels_mask

# plots
f, ax = plt.subplots()
# if more thn one plot 
# gs = mpl.gridspec.GridSpec(2,2)
# gs.update(wspace=0.2, hspace= 0.2)
# masked image 
ax.imshow(img * img_mask1, cmap="gray")
ixs = np.indices(img.shape)

, но теперь я не знаю, как получить значения серого для каждой из 5 областей. Мои результаты должны выглядеть примерно так: Нахождение средних значений пикселей в списке BLOB-объектов, определенных методом blob_log (Laplacian of Gaussian) scikit-image

Маскированное изображение: masked image

1 Ответ

1 голос
/ 27 февраля 2020

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

import numpy as np
from skimage import io
import matplotlib.pyplot as plt
import matplotlib.patches as patches

img = io.imread('https://i.stack.imgur.com/2YAwu.png')

vertices = [(200, 200),  # upper left corner
            (400, 400),  # lower right corner
            (200, 1200), # and so on...
            (800, 1400)]

fig, ax = plt.subplots(1)
ax.imshow(img, cmap='gray')

for (upper, left), (lower, right) in zip(vertices[0:-1:2], vertices[1::2]):
    subimg = img[upper:lower, left:right]
    avg = subimg.mean()
    print(f'Mean of img[{upper}:{lower}, {left}:{right}]={avg}')
    rect = patches.Rectangle((left, upper), right-left, lower-upper, 
                             linewidth=2, edgecolor='r', facecolor='none')
    ax.add_patch(rect)

plt.show()

Выход

Mean of img[200:400, 200:400]=134.5452
Mean of img[200:800, 1200:1400]=0.0

output

...