Обнаружение царапин на изображении с большим шумом

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

Вот эти изображения: введите описание изображения здесь

введите описание изображения здесь

В настоящее время я попробовал некоторые виды фильтров (сглаживание, средний, средний, гауссовский фильтр или детектор края Sobel), чтобы стереть шум и обнаружить царапины, но они мало помогают. Не могли бы вы предложить какую-то идею? Некоторые инструменты или алгоритмы, которые я должен рассмотреть?

Ответы

Ответ 1

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

clc

clear all

close all

  • Прочитайте оба изображения и уменьшите их (для быстрого вычисления) в 2 раза.

im1 = imresize(imread('scratch.jpg'),0.5);

Scratch 1 введите описание изображения здесь

  1. Преобразуйте их в шкалу серого.

gray = rgb2gray(im);

GrayImage введите описание изображения здесь

  1. Примените гауссовский фильтр размером 15 X 15.

gSize = 15;

gray = imfilter(gray,fspecial('gaussian',[gSize,gSize],gSize/2),'replicate');

введите описание изображения здесь введите описание изображения здесь

  1. Определить градиентную величину изображений с помощью маски Sobel.

[~,~,mg,~] = ImageFeatures.Gradients(gray);

введите описание изображения здесь введите описание изображения здесь

  1. Пороговое значение градиента с порогом 30 процентов максимального значения.

`mgBw = мг > 0,3 * макс (мг (:));

введите описание изображения здесь введите описание изображения здесь

  1. Применить морфологическую операцию Закрытие двоичного образа с помощью маски диска 3 X 3.

mgBw = imclose(mgBw,strel('disk',1));

введите описание изображения здесь введите описание изображения здесь

  1. Применить анализ частиц (CCL).

mgBw = bwareaopen(mgBw,500);

введите описание изображения здесь введите описание изображения здесь

  1. Снова закройте изображение для объединения строк вместе.

mgBw = imclose(mgBw,strel('disk',2));

введите описание изображения здесь введите описание изображения здесь

  1. Заполните отверстия на изображении.

mgBw = imfill(mgBw,'holes');

введите описание изображения здесь введите описание изображения здесь

  1. Конечные аннотации:

введите описание изображения здесь введите описание изображения здесь

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

Спасибо

Значения для гауссовской маски приведены ниже. Я только что скопировал их, вы можете использовать только значения 4 места после десятичной и еще одну вещь до свертки, масштабируя ваши значения изображения от 0 до 1:

         0.00253790859361804,0.00284879446220838,0.00314141610419987,0.00340305543986557,0.00362152753952273,0.00378611472031542,0.00388843599983945,0.00392315394879368,0.00388843599983945,0.00378611472031542,0.00362152753952273,0.00340305543986557,0.00314141610419987,0.00284879446220838,0.00253790859361804;
         0.00284879446220838,0.00319776287779517,0.00352622975612324,0.00381991909245893,0.00406515334132644,0.00424990193722614,0.00436475725361032,0.00440372804277458,0.00436475725361032,0.00424990193722614,0.00406515334132644,0.00381991909245893,0.00352622975612324,0.00319776287779517,0.00284879446220838;
         0.00314141610419987,0.00352622975612324,0.00388843599983945,0.00421229243210782,0.00448271658130972,0.00468644212981339,0.00481309512122034,0.00485606890058492,0.00481309512122034,0.00468644212981339,0.00448271658130972,0.00421229243210782,0.00388843599983945,0.00352622975612324,0.00314141610419987;
         0.00340305543986557,0.00381991909245893,0.00421229243210782,0.00456312191696750,0.00485606890058492,0.00507676215263394,0.00521396370030743,0.00526051663974220,0.00521396370030743,0.00507676215263394,0.00485606890058492,0.00456312191696750,0.00421229243210782,0.00381991909245893,0.00340305543986557;
         0.00362152753952273,0.00406515334132644,0.00448271658130972,0.00485606890058492,0.00516782273108746,0.00540268422664802,0.00554869395001131,0.00559823553262373,0.00554869395001131,0.00540268422664802,0.00516782273108746,0.00485606890058492,0.00448271658130972,0.00406515334132644,0.00362152753952273;
         0.00378611472031542,0.00424990193722614,0.00468644212981339,0.00507676215263394,0.00540268422664802,0.00564821944786971,0.00580086485975791,0.00585265795345929,0.00580086485975791,0.00564821944786971,0.00540268422664802,0.00507676215263394,0.00468644212981339,0.00424990193722614,0.00378611472031542;
         0.00388843599983945,0.00436475725361032,0.00481309512122034,0.00521396370030743,0.00554869395001131,0.00580086485975791,0.00595763557555571,0.00601082839853353,0.00595763557555571,0.00580086485975791,0.00554869395001131,0.00521396370030743,0.00481309512122034,0.00436475725361032,0.00388843599983945;
         0.00392315394879368,0.00440372804277458,0.00485606890058492,0.00526051663974220,0.00559823553262373,0.00585265795345929,0.00601082839853353,0.00606449615428972,0.00601082839853353,0.00585265795345929,0.00559823553262373,0.00526051663974220,0.00485606890058492,0.00440372804277458,0.00392315394879368;
         0.00388843599983945,0.00436475725361032,0.00481309512122034,0.00521396370030743,0.00554869395001131,0.00580086485975791,0.00595763557555571,0.00601082839853353,0.00595763557555571,0.00580086485975791,0.00554869395001131,0.00521396370030743,0.00481309512122034,0.00436475725361032,0.00388843599983945;
         0.00378611472031542,0.00424990193722614,0.00468644212981339,0.00507676215263394,0.00540268422664802,0.00564821944786971,0.00580086485975791,0.00585265795345929,0.00580086485975791,0.00564821944786971,0.00540268422664802,0.00507676215263394,0.00468644212981339,0.00424990193722614,0.00378611472031542;
         0.00362152753952273,0.00406515334132644,0.00448271658130972,0.00485606890058492,0.00516782273108746,0.00540268422664802,0.00554869395001131,0.00559823553262373,0.00554869395001131,0.00540268422664802,0.00516782273108746,0.00485606890058492,0.00448271658130972,0.00406515334132644,0.00362152753952273;
         0.00340305543986557,0.00381991909245893,0.00421229243210782,0.00456312191696750,0.00485606890058492,0.00507676215263394,0.00521396370030743,0.00526051663974220,0.00521396370030743,0.00507676215263394,0.00485606890058492,0.00456312191696750,0.00421229243210782,0.00381991909245893,0.00340305543986557;
         0.00314141610419987,0.00352622975612324,0.00388843599983945,0.00421229243210782,0.00448271658130972,0.00468644212981339,0.00481309512122034,0.00485606890058492,0.00481309512122034,0.00468644212981339,0.00448271658130972,0.00421229243210782,0.00388843599983945,0.00352622975612324,0.00314141610419987;
         0.00284879446220838,0.00319776287779517,0.00352622975612324,0.00381991909245893,0.00406515334132644,0.00424990193722614,0.00436475725361032,0.00440372804277458,0.00436475725361032,0.00424990193722614,0.00406515334132644,0.00381991909245893,0.00352622975612324,0.00319776287779517,0.00284879446220838;
         0.00253790859361804,0.00284879446220838,0.00314141610419987,0.00340305543986557,0.00362152753952273,0.00378611472031542,0.00388843599983945,0.00392315394879368,0.00388843599983945,0.00378611472031542,0.00362152753952273,0.00340305543986557,0.00314141610419987,0.00284879446220838,0.00253790859361804;

Sobel Mask:

 1, 2, 1;
 0, 0, 0;
-1,-2, 1;

и

 1, 0,-1;
 2, 0,-2;
 1, 0,-1;

Коэффициент масштабирования градиента Собеля (ImageFeatures.Gradient):

function [gx,gy,mag,phi] = Gradients(gray)
    gray = double(gray);
    horzmask = fspecial('sobel');
  %  vertmask = horzmask';

    gx = imfilter(gray,horzmask,'replicate');
    gy = imfilter(gray,horzmask','replicate');

    phi = (atan2((gy),(gx)));

    mag = mat2gray(sqrt(gx.^2+gy.^2));
end

Ответ 2

Я попробовал следующую процедуру для обнаружения. Результат выглядит умеренным, но все же я думал о совместном использовании.

  • уменьшите цветное изображение.
  • применяйте медианное размытие с разными размерами окон, затем используйте абсолютную разницу: я делаю это, чтобы улучшить царапины и в то же время добиться выравнивания освещенности. Ниже показаны разностные изображения, полученные таким образом. образец разностного изображения sample difference image 2

  • Используйте гауссовскую смесь на основе фона/сегментацию переднего плана, чтобы сегментировать царапины в разностном изображении. Идея здесь заключается в том, что мы можем извлечь из этого изображения m x n окна и тренировать. Поскольку царапины не занимают большую площадь в разностном изображении, мы можем думать, что изученный фон должен приблизиться к области за пределами царапин. Этот метод работал лучше для обоих разностных изображений, чем применение порога к разностному изображению. Этот метод не сработал, когда я напрямую подал изображение с пониженной дискретизацией. Я думаю, это связано с неравномерностью значений цвета пикселей в регионах. Поэтому я использовал изображение с раздвоенным размытием. Ниже представлены сегментированные изображения. Эта процедура медленная, так как она проверяет все возможные m x n окна в изображении. segmented segmented 2

  • используйте вероятностное преобразование Хафа для обнаружения линий в сегментированном изображении. Используя плотность линий в регионах или используя морфологическую фильтрацию для линий, я думаю, что можно получить разумное предположение о том, где находятся царапины. hough lones hough lines 2

Здесь код

код сегментации фона:

Mat threshold_mog(Mat& im, Size window)
{
    BackgroundSubtractorMOG2 bgModel;
    Mat fgMask;
    Mat output = Mat::ones(im.rows, im.cols, CV_8U);

    for (int r = 0; r < im.rows - window.height; r++)
    {
        for (int c = 0; c < im.cols - window.width; c++)
        {
            bgModel.operator()(im(Rect(c, r, window.width, window.height)), fgMask);
        }
    }

    for (int r = 0; r < im.rows - window.height; r++)
    {
        for (int c = 0; c < im.cols - window.width; c++)
        {
            Mat region = im(Rect(c, r, window.width, window.height));
        bgModel.operator()(region, fgMask, 0);
            fgMask.copyTo(output(Rect(c, r, window.width, window.height)));
        }
    }

    return output;
}

главная:

Mat rgb = imread("scratch_2.png.jpg");

pyrDown(rgb, rgb);

Mat med, med2, dif, bw;

medianBlur(rgb, med, 3);
medianBlur(rgb, med2, 21);

absdiff(med2, med, dif);

bw = threshold_mog(dif, Size(15, 15));

Mat dst = bw.clone();
vector<Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI/180, 8, 10, 20);
for( size_t i = 0; i < lines.size(); i++ )
{
    Vec4i l = lines[i];
    line(rgb, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 1, CV_AA);
}

Ответ 3

Я следую процедуре Ankit Dixit, чтобы обнаружить царапины и получить некоторые проблемы. Во-первых, потому что я использую С++ вместо MATLAB, поэтому я хотел бы проверить, есть ли непонимание алгоритма.

В настоящее время я просто использую Gaussian Filter 5x5, потому что он доступен. По какой причине вы выбрали размер окна 15x15 вместо 5x5? Во-вторых, мое изображение после маски Sobel кажется не таким хорошим, как ваше. Есть ли в Sobel от Matlab какие-либо специальные/разные?

Вот изображения: Серый: http://s15.postimg.org/q8s5y2sjf/Gray_Image.png Гауссовский фильтр 5x5: http://s1.postimg.org/80r9x20tr/Gaussian_Filter_5x5.png Сделать Собель: http://s21.postimg.org/vxwyju58n/Sobel_Image.png