Как убрать шум возле края объекта на изображении - PullRequest
3 голосов
/ 05 июля 2011

У меня есть изображение, подобное этому:

Input image containing noise

Я хотел бы удалить фон (часть A) рядом с краем объекта.Я планирую использовать определение цвета, так как цвет объекта и шум немного отличаются.Но, возможно, это не очень хорошая идея.

Я был бы признателен, если бы у вас была идея для меня.Спасибо

1 Ответ

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

Если вы выполняете какую-либо цветовую сегментацию изображений, вам может быть проще сначала преобразовать в цветовое пространство HSV , чтобы выбрать определенные цветовые диапазоны.Я обрисую, как вы можете делать такие вещи в ответе, который я дал на аналогичный вопрос .Шаги, которые вы, вероятно, захотите выполнить, будут следующими:

  • Преобразовать в HSV и создать двоичную маску, выбрав пиксели с оттенками в диапазоне зеленого цвета и с минимальным количеством насыщенности и значения.
  • Удалите результирующую маску на определенную величину, чтобы удалить маленькие паразитные кластеры.
  • Расширьте размытую маску, чтобы вернуться к более плавному краю для выбранных пикселей.

Я не могу привести точный пример того, как вы применили бы этот анализ к своим данным, поскольку изображение, которое вы предоставляете в вопросе, на самом деле имеет более высокое разрешение, чем данные, которые оно отображает, но вот общее решение, котороеиспользует функции RGB2HSV , IMERODE и IMDILATE (последние две из Toolbox Toolbox ):

rgbImage = imread('data.jpg');  %# Load the RGB image
hsvImage = rgb2hsv(rgbImage);   %# Convert to HSV color space
hPlane = 360.*hsvImage(:,:,1);  %# Get the hue plane, scaled from 0 to 360
vPlane = hsvImage(:,:,3);       %# Get the value plane
mask = (hPlane >= 80) & (hPlane <= 140) & (vPlane >= 0.3);  %# Select a mask
SE = strel('disk',10);                 %# Create a disk-shaped element
mask = imdilate(imerode(mask,SE),SE);  %# Erode and dilate the mask

А вот некоторый код для визуализации ребер, созданных в результате вышеуказанного анализа:

edgeMask = mask-imerode(mask,strel('disk',1));  %# Create an edge mask
edgeImage = zeros([size(edges) 3]);     %# Create an RGB image for the edge
edgeImage(find(edgeMask)) = 1;          %#   that's colored red
image(rgbImage);                        %# Plot the original image
hold on;
image(edgeImage,'AlphaData',edgeMask);  %# Plot the edge image over it

enter image description here

...