Артефакты в обработанных изображениях

Этот вопрос связан с моим предыдущим post алгоритмом обработки изображений в Matlab в stackoverflow, который у меня уже получил результаты, которые я хотел.

Но теперь я столкнулся с другой проблемой и получаю некоторые артефакты в образах процесса. В моих исходных изображениях (стек из 600 изображений) я не вижу никаких артефактов, пожалуйста, посмотрите оригинальное изображение из пальца ногтя:

enter image description here

Но в моих 10 обработанных результатах я вижу эти строки:

enter image description here

Я действительно не знаю, откуда они взялись?

Кроме того, если они относятся к датчику камеры, почему я не вижу их в своих исходных изображениях? Любая идея?

Edit:

Я добавил следующий код, предложенный @Jonas. Он уменьшает артефакт, но не полностью удаляет их.

%averaging of images
im = D{1}(:,:);
for i = 2:100
 im = imadd(im,D{i}(:,:));
end
im = im/100;
imshow(im,[]);

for i=1:100
SD{i}(:,:)=imsubtract(D{i}(:,:),im(:,:))
end

@belisarius попросил больше изображений, поэтому я собираюсь загрузить 4 изображения с моего пальца с рисунком пятна и 4 изображениями с черного фона (1280x1024):

image1image2image3iamge4

И вот черный фон:

blackbackground1blackbackground2blackbackground3

Ответы

Ответ 1

Вот ответ, который по мнению удалит строки более мягко, чем вышеупомянутые методы:

im = imread('image.png');   % Original image
imFiltered = im;            % The filtered image will end up here
imChanged = false(size(im));% To document the filter performance 

% 1)
% Compute the histgrams for each column in the lower part of the image
% (where the columns are most clear) and compute the mean and std each
% bin in the histogram.
histograms = hist(double(im(501:520,:)),0:255);
colMean = mean(histograms,2);
colStd = std(histograms,0,2);

% 2)
% Now loop though each gray level above zero and...
for grayLevel = 1:255

    % Find the columns where the number of 'graylevel' pixels is larger than
    % mean_n_graylevel + 3*std_n_graylevel). - That is columns that contains
    % statistically 'many' pixel with the current 'graylevel'. 
    lineColumns = find(histograms(grayLevel+1,:)>colMean(grayLevel+1)+3*colStd(grayLevel+1));

    % Now remove all graylevel pixels in lineColumns in the original image
    if(~isempty(lineColumns))
        for col = lineColumns 
            imFiltered(:,col) = im(:,col).*uint8(~(im(:,col)==grayLevel));
            imChanged(:,col) = im(:,col)==grayLevel;
        end
    end 
end

imshow(imChanged)
figure,imshow(imFiltered)

Вот изображение после фильтрации

Filtered Image

И это показывает пиксели, на которые влияет фильтр

Pixels affected by filter

Ответ 2

Ваши артефакты действительно присутствуют в вашем исходном изображении, хотя и не видны. Код в Mathematica:

i = [email protected]"http://i.stack.imgur.com/5hM3u.png"

enter image description here

EntropyFilter[i, 1]

enter image description here

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

Binarize[i, .001] 

enter image description here

Что касается того, что вызывает их, я могу только догадываться. Я бы начал трассировку с самого выхода камеры. Кроме того, вы можете опубликовать два или три изображения "как они идут прямо с камеры", чтобы позволить нам экспериментировать.

Ответ 3

Используемая камера, скорее всего, имеет CMOS-чип. Поскольку у них есть независимые колонки (и, возможно, рядные) усилители, которые могут иметь несколько иные электронные свойства, вы можете получить сигнал от одного столбца более усиленным, чем от другого.

В зависимости от камеры эта изменчивость интенсивности столбцов может быть стабильной. В этом случае вам повезло: возьмите ~ 100 темных изображений (запишите что-то поверх объектива), усредните их, а затем вычтите из каждого изображения перед запуском анализа. Это должно привести к тому, что линии исчезнут. Если строки не исчезают (или если есть дополнительные строки), используйте схему обработки предложенную Amro, чтобы удалить строки после бинаризации.

ИЗМЕНИТЬ

Вот как вы делаете вычитание фона, предполагая, что вы взяли 100 темных изображений и сохранили их в массиве ячеек D со 100 элементами:

% take the mean; convert to double for safety reasons
meanImg = mean( double( cat(3,D{:}) ), 3); 

% then you cans subtract the mean from the original (non-dark-frame) image
correctedImage = rawImage - meanImg; %(maybe you need to re-cast the meanImg first)

Ответ 4

Вы можете использовать какой-то морфологический opening для удаления тонких вертикальных линий:

img = imread('image.png');
SE = strel('line',2,0);
img2 = imdilate(imerode(img,SE),SE);

subplot(121), imshow(img)
subplot(122), imshow(img2)

screenshot

Используемый элемент структурирования:

>> SE.getnhood
ans =
     1     1     1

Ответ 5

Не вникая в обработку изображений, я могу подумать о двух причинах:

  • Обработка привела эти артефакты. Это маловероятно, но это вариант. Проверьте свой алгоритм и свой код.

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

Ответ 6

Это ОЧЕНЬ интересный вопрос. Я имел дело с этим типом проблемы с живыми ИК-изображениями (видеосистемами). На самом деле у нас были встроенные в камеры алгоритмы для решения этой проблемы до того, как пользователь увидит или возьмет на себя изображение. Пара вопросов:

1) вы имеете дело с изображениями RAW или имеете дело с уже предварительно обработанными изображениями в оттенках серого (или RGB)?

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

Я согласен, что эти строки, скорее всего, во всех ваших изображениях. Есть две причины для тех линий, которые когда-либо появляются в изображении, можно было бы увидеть яркую сцену, где OP AMP для колонок будет насыщен, что приведет к выходу целых столбцов вашего изображения, чтобы получить самую яркую камеру значений. Другой причиной могут быть плохие OP AMP или АЦП (аналого-цифровые преобразователи) сами (скорее всего, не АЦП, как обычно, по существу, 1 АЦП для всего датчика, что сделало бы весь образ плохим, а не вашим делом). На самом деле проблему насыщения на самом деле гораздо труднее (и я не думаю, что это ваша проблема). Примечание. Слишком большая насыщенность сенсора может привести к возникновению проблемных пикселей и столбцов в вашем сенсоре (поэтому они говорят, что никогда не указывайте камеру на солнце). Проблема с плохой колонкой может быть решена. Выше в другом ответе кто-то усреднил изображения. Хотя это может быть полезно узнать, где плохие столбцы (или плохие одиночные пиксели или матрица шума вашего датчика) (и вам придется усреднить указание камеры на черный, белый, по существу сплошные цвета), это не " правильный ответ, чтобы избавиться от них. Кстати, то, что я объясняю черно-белым и усредняющим, и обнаруживаю плохие пиксели и т.д., Называется калибровкой вашего датчика.

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

Если у вас есть эти данные, один из способов удалить столбцы:

for each bad column
    for each pixel (x, y) on the bad column
        pixel(x, y) = Average(pixel(x+1,y),pixel(x+1,y-1),pixel(x+1,y+1),
                              pixel(x-1,y),pixel(x-1,y-1),pixel(x-1,y+1))

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

Теперь, причина, по которой я спросил о RAW против B/W или RGB. Если вы обрабатывали RAW, в зависимости от сборки самого датчика, может случиться, что только один субпиксель (если потребуется) фильтра с фильтром фильтра Bayer имеет плохой OP AMP. Если бы вы могли обнаружить это, тогда вам не обязательно выкидывать другие хорошие субпиксельные данные. Во-вторых, если вы используете датчик RGB, чтобы взять фотографию в оттенках серого, и вы застрелили ее в RAW, тогда вы сможете рассчитать собственные пиксели серого. Многие датчики при возврате изображения в оттенках серого при использовании датчика RGB просто передадут зеленый пиксель в качестве общего пикселя. Это связано с тем, что он действительно служит в качестве люминесценции изображения. Вот почему большинство датчиков изображения реализуют 2 зеленых субпикселя для каждого подпикселя r или g. Если это то, что они делают (не все датчики делают это), тогда вам может быть лучше удастся избавиться от столбца плохого канала и выполнить собственное преобразование оттенков серого с помощью.

gray = (0.299*r + 0.587*g + 0.114*b)

Извинения за длинный ответ, но я надеюсь, что это все еще информативно для кого-то: -)

Ответ 7

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

Форма сигнала помех для первого параметра... (Если у вас нет алгоритма, который обрабатывает каждую строку отдельно.)

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