Python; Определение и добавление шума к сегментам изображения - PullRequest
2 голосов
/ 23 апреля 2019

Чтобы получить представление о кодировании, я решил определить стандартное отклонение в определенной области рентгеновского изображения, используя Python / Numpy / SKimage. Для начала я решил использовать пороговое значение, чтобы получить часть изображения, это было не сложно.

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

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

Мои основы -

import numpy as np
import matplotlib.pyplot as plt
import imageio

image = imageio.imread('thx.jpg', as_gray=True)
image = image.astype('int32')

test1 = np.array(image, copy=True)
test1[image >= 100] = 0

Я ищу способ исключить данные выше / ниже порога. Может ли кто-нибудь дать мне небольшой толчок в правильном направлении?

Редактировать: Приятно время от времени проводить легкий рабочий день; Дополнительным решением моей проблемы является добавление всех значений больше / меньше, чем в список и определение стандартного отклонения оттуда. Это, однако, оставляет меня с проблемой реализации шума до сегментов изображения.

im_row = image.shape[0]
im_col = image.shape[1]
grthen = []
smlthen = []

for i in range(0,im_col-1):
    for j in range(0,im_row-1):
        if (j > 100):
           grthen.append(j)
        else:
            smlthen.append(j)

print(np.std(smlthen))
print(np.std(grthen))

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Я думаю, проблема в том, что вы устанавливаете все эти пиксели на ноль, а затем пытаетесь получить статистику по ним. Вместо этого, поймите, что test1[image < 100] относится только к тем пикселям ниже порогового значения ... поэтому я думаю, что вы можете просто получить из этого статистику, например, с np.std(test1[image < 100]).

Возможно, вы захотите взглянуть на scikit-image, который содержит множество инструментов для определения пороговых значений, работы с двоичными изображениями, использования их в качестве масок (что, по сути, то, что вы делаете) и т. Д. .

1 голос
/ 23 апреля 2019

... определить стандартное отклонение в определенной области рентгеновского изображения с помощью Python / Numpy / SKimage.

Давайте сначала сгенерируем фиктивное изображение:

In [18]: import numpy as np

In [19]: rows, cols = 4, 4

In [20]: image = np.linspace(0, 1, rows*cols).reshape(rows, cols)

In [21]: np.set_printoptions(precision=2)

In [22]: image
Out[22]: 
array([[0.  , 0.07, 0.13, 0.2 ],
       [0.27, 0.33, 0.4 , 0.47],
       [0.53, 0.6 , 0.67, 0.73],
       [0.8 , 0.87, 0.93, 1.  ]])

И давайте определим интересующую область с помощью двойного порога:

In [25]: low, high = .3, .6

In [26]: mask = np.logical_and(image > low, image < high)

In [27]: mask
Out[27]: 
array([[False, False, False, False],
       [False,  True,  True,  True],
       [ True, False, False, False],
       [False, False, False, False]])

Булево индексирование - это возможный способ вычисления стандартного отклонения по интересующей области:

In [29]: image[mask]
Out[29]: array([0.33, 0.4 , 0.47, 0.53])

In [30]: np.std(image[mask])
Out[30]: 0.07453559924999299

Установка нежелательных пикселей на np.nan и использование NumPy's nanstd для вычисления стандартного отклонения - это еще один способ:

In [32]: test1 = np.where(mask, image, np.nan)

In [33]: test1
Out[33]: 
array([[ nan,  nan,  nan,  nan],
       [ nan, 0.33, 0.4 , 0.47],
       [0.53,  nan,  nan,  nan],
       [ nan,  nan,  nan,  nan]])

In [34]: np.nanstd(test1)
Out[34]: 0.07453559924999299

... проблема реализации шумов на сегментах изображения.

Вы можете использовать scikit-images random_noise, чтобы создать зашумленное изображение, а затем отфильтровать эти пиксели за пределами интересующей области через NumPy's where:

In [36]: from skimage.util import random_noise

In [37]: noisy = random_noise(image)

In [38]: noisy
Out[38]: 
array([[0.14, 0.07, 0.17, 0.29],
       [0.34, 0.39, 0.38, 0.53],
       [0.66, 0.73, 0.66, 0.67],
       [0.73, 0.98, 1.  , 0.88]])

In [39]: np.where(mask, noisy, image)
Out[39]: 
array([[0.  , 0.07, 0.13, 0.2 ],
       [0.27, 0.39, 0.38, 0.53],
       [0.66, 0.6 , 0.67, 0.73],
       [0.8 , 0.87, 0.93, 1.  ]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...