Удаление фонового шума с изображения - PullRequest
4 голосов
/ 18 июля 2011

У меня есть два изображения.Первый из них имеет фоновый шум + контент, а второй только фоновый шум.Я хотел бы вычесть второе изображение из первого, чтобы удалить шум из содержимого.Изображение в оттенках серого.

Я запутался в различных способах обработки, а также в обработке значений оттенков серого в mathematica.

1) Во-первых, мы можем использовать ImageSubtract[imageOne, imageTwo].

2) Используя ImageDifference[imageOne, imageTwo], мы избегаем отрицательных значений пикселей, но изображение является искусственным в тех местах, где мы должны были бы иметь отрицательные пиксели при использовании ImageSubtract.

* 1011.* 3) Мы получаем значения каждого пикселя, используя ImageData, вычитаем каждое соответствующее значение и затем отображаем результат, используя Image.

Каждый из этих методов дает разные результаты.

1 Ответ

6 голосов
/ 18 июля 2011

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

real1 = Image[RandomReal[1, {10, 10}]];
real2 = Image[RandomReal[1, {10, 10}]];

ImageData[ImageDifference[real1, real2]] ==
Abs@ImageData[ImageSubtract[real1, real2]] ==
Abs[ImageData[real1] - ImageData[real2]]

Out[4]= True

Но это не относится к изображениям целочисленных типов данных.Это связано с тем, что в таких изображениях могут храниться только положительные значения, а отрицательные результаты вычитания обрезаются до нуля в выходном изображении:

int1 = Image[RandomInteger[255, {10, 10}], "Byte"];
int2 = Image[RandomInteger[255, {10, 10}], "Byte"];

Это по-прежнему True:

ImageData[ImageDifference[int1, int2]]
== Abs[ImageData[int1] - ImageData[int2]]

Но эти два значения различаются из-за отсечения:

ImageData[ImageDifference[int1, int2]]
== Abs@ImageData[ImageSubtract[int1, int2]]

При преобразовании обоих входных изображений в тип данных "Real" или "Real32" было бы меньше удивительных результатов.

...