Обрезка изображения до области объекта - PullRequest
0 голосов
/ 01 ноября 2018

Я собираюсь применить распознавание текстур к различным цветочным изображениям, и я рассматриваю GLCM для извлечения объектов. Перед применением GLCM я должен преобразовать изображения RGB в серые изображения. Я также хочу вычесть фоновую информацию из серых изображений, чтобы применить GLCM только к цветочным пикселям объекта для удаления шума. Я подумываю об использовании лыжного мага. Как вычесть пиксели фона из серого изображения, чтобы большинство пикселей принадлежало цветочному объекту?

1 Ответ

0 голосов
/ 03 ноября 2018

Если фоновые пиксели имеют постоянное значение интенсивности, скажем, 0, вы можете использовать любой из методов, предложенных в Использование скимаджа для непрямоугольных областей изображения или Python: взятие GLCM непрямоугольной области . Обратите внимание, что эти методы дают приблизительный GLCM, так как пиксели изображения с тем же уровнем интенсивности, что и фоновые пиксели, отбрасываются из совместного анализа.

Если вы хотите вычислить все совместные вхождения в интересующей области, не отбрасывая ни одного пикселя внутри области интереса, следующий фрагмент может поставить вас на правильный путь:

import numpy as np 
from skimage import io, color, util
from skimage.feature.texture import greycoprops
import matplotlib.pyplot as plt

def glcm_roi(img, mask, dh=1, dv =0, levels=256):
    glcm = np.zeros(shape=(levels, levels), dtype=np.int_)
    for i in range(img.shape[0] - dv):
        for j in range(img.shape[1] - dh):
            if mask[i, j] and mask[i + dv, j + dh]:
                glcm[img[i, j], img[i + dv, j + dv]] += 1
    return glcm/glcm.sum()

arr = io.imread('https://i.stack.imgur.com/q6cpu.png')
mask = arr[:, :, -1] > 0
img = util.img_as_ubyte(color.rgb2gray(arr[:, :, :-1]))

glcm = glcm_roi(img, mask)
energy = greycoprops(glcm[:, :, None, None], 'energy')
print('Energy = {}'.format(energy))

fig, ax = plt.subplots(1, 3)
ax[0].imshow(arr)
ax[0].set_title('RGB')
ax[1].imshow(img, cmap='gray')
ax[1].set_title('Gray')
ax[2].imshow(mask, cmap='gray')
ax[2].set(title='Mask')
for axi in ax: axi.set_axis_off()
plt.show(fig)

Выход:

[[0.15203625]]

Results

...