чистый шум от изображения - PullRequest
3 голосов
/ 15 марта 2011

Мне нужно знать, как убрать шум с изображения с помощью Matlab.

Давайте рассмотрим этот пример:

enter image description here enter image description here

как видите цифры не выглядят четко.

так, как я могу убрать шум и пиксели, которые не являются числами, так что идентификация будет легче.

спасибо.

Ответы [ 4 ]

22 голосов
/ 07 июня 2011

Давайте сделаем это шаг за шагом в Mathematica:

(*first separate the image in HSB channels*)
i1 = ColorSeparate[ColorNegate@yourColorImage, "HSB"]

enter image description here

(*Let's keep the B Channel*)
i2 = i1[[3]]

enter image description here

(*And Binarize it *)
i3 = Binarize[i2, 0.92]

enter image description here

(*Perform a Thinning to get the skeleton*)
i4 = Thinning[i3]

enter image description here

(*Now we cut those hairs*)
i5 = Pruning[i4, 10]

enter image description here

(*Remove the small lines*)
i6 = DeleteSmallComponents[i5, 30]

enter image description here

(*And finally dilate*)
i7 = Dilation[i6, 3]

enter image description here

(*Now we can perform an OCR*)
TextRecognize@i7
-->"93 269 23"  

Готово!

17 голосов
/ 05 июля 2011

Поскольку этот вопрос помечен MATLAB, я перевел решение @ belisarius как таковое (которое, я думаю, превосходит принятый в настоящее время ответ):

%# read image
I = imread('http://i.stack.imgur.com/nGNGf.png');

%# complement it, and convert to HSV colorspace
hsv = rgb2hsv(imcomplement(I));
I1 = hsv(:,:,3);                %# work with V channel

%# Binarize/threshold image
I2 = im2bw(I1, 0.92);

%# Perform morphological thinning to get the skeleton
I3 = bwmorph(I2, 'thin',Inf);

%# prune the skeleton (remove small branches at the endpoints)
I4 = bwmorph(I3, 'spur', 7);

%# Remove small components
I5 = bwareaopen(I4, 30);

%# dilate image
I6 = imdilate(I5, strel('square',2*3+1));

%# show step-by-step results
figure('Position',[200 150 700 700])
subplot(711), imshow(I)
subplot(712), imshow(I1)
subplot(713), imshow(I2)
subplot(714), imshow(I3)
subplot(715), imshow(I4)
subplot(716), imshow(I5)
subplot(717), imshow(I6)

enter image description here

Наконец, вы можете применить некоторую форму OCR для распознавания номеров.К сожалению, в MATLAB нет встроенной функции, эквивалентной TextRecognize[] в Mathematica ... А пока, посмотрите на File Exchange , я уверен, что вы найдете десятки представлений, заполняющих пробел :)

7 голосов
/ 16 марта 2011

Вы начали с двухуровневого (двухцветного, черного и белого)? Или вы сами это сделали?

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

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

EDIT

Хорошо, технически ваше изображение не очень шумное - оно размытое (буквы сталкиваются друг с другом) и имеет фоновые помехи.

Но в любом случае, вот как бы я справился с этим:

  • Выберите цветовой канал для работы (RGB - это три канала, обычно достаточно одного). Я выбрал зеленый, потому что им было проще всего манипулировать.
  • Размытие изображения (я использовал гауссово ядро ​​5x5 в GIMP)
  • Порог с использованием эмпирически определенного порога (в основном, пробуйте каждый порог, пока не получите достойный результат). Это нормально, если у некоторых чисел есть пробелы - мы можем закрыть их на следующем шаге
  • Морфологическая обработка изображений (эрозия и расширение)

Зеленый канал:

enter image description here

Blur (5x5 Gaussian):

enter image description here

Пороговое изображение (я использовал порог ~ 93 в GIMP):

enter image description here

Окончательный результат:

enter image description here

Вы можете видеть, что промежутки в середине 6 и 9 исчезли. К сожалению, я не смог получить разрыв в 3 левых, чтобы его убрать - он просто слишком большой. Вот каковы проблемы, вызывающие это:

  • Линия вдоль верхней части изображения намного темнее, чем некоторые части 3. Если вы используете порог для удаления линии, то будет создан промежуток. Если бы вы каким-то образом удалили эту строку (например, с помощью более усердного обрезания), результат определения порога был бы намного лучше, если говорить о 3.
  • Кроме того, средние 2 и 6 работают вместе. Тяжелая пороговая обработка требуется, чтобы они не образовывали один и тот же шарик после пороговой обработки.
0 голосов
/ 15 марта 2011

Я думаю, что есть две вещи, которые вы могли бы сделать, чтобы сделать их более заметными:

  1. Удалить патчи меньше определенного количества пикселей (это приведет к удалению пятен между наборами цифр)
  2. Числа должны быть «закрытыми» формами, поэтому вам нужен алгоритм для обнаружения пикселей (вверху каждого числа), которые должны быть заменены на черные, чтобы «закрыть» число «фигур».

У вас также есть линейные элементы, которые являются частью шумового сигнала, который можно обнаружить с помощью обнаружения края / линии.

Обнаружение смежных «зон» и вычисление таких характеристик, как компактность или длина / высота, также может помочь в определении структур, которые следует сохранить ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...