Пользовательский банк фильтров не генерирует ожидаемый результат

Пожалуйста, обратитесь к этой статье.

Я реализовал раздел 4.1 (Предварительная обработка).

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

Мы выбрали 12 неперекрывающихся фильтров для анализа 12 различных направлений, повернутых относительно друг друга на 15°.

Репозиторий GitHub находится здесь.

Поскольку данная формула в статье неверна, я попробовал два набора разных формул.

Первый набор формул

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

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

Второй набор формул

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

Ожидаемый результат должен быть,

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

Ни один из них не дает должных результатов.

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

Кто-нибудь может предложить мне какую-либо модификацию?


Репозиторий GitHub находится здесь.

Наиболее важная часть исходного кода находится здесь:

    public List<Bitmap> Apply(Bitmap bitmap)
    {
        Kernels = new List<KassWitkinKernel>();

        double degrees = FilterAngle;

        KassWitkinKernel kernel;
        for (int i = 0; i < NoOfFilters; i++)
        {
            kernel = new KassWitkinKernel();
            kernel.Width = KernelDimension;
            kernel.Height = KernelDimension;
            kernel.CenterX = (kernel.Width) / 2;
            kernel.CenterY = (kernel.Height) / 2;
            kernel.Du = 2;
            kernel.Dv = 2;
            kernel.ThetaInRadian = Tools.DegreeToRadian(degrees);
            kernel.Compute();

            //SleuthEye
            kernel.Pad(kernel.Width, kernel.Height, WidthWithPadding, HeightWithPadding);

            Kernels.Add(kernel);

            degrees += degrees;
        }

        List<Bitmap> list = new List<Bitmap>();

        Bitmap image = (Bitmap)bitmap.Clone();

        //PictureBoxForm f = new PictureBoxForm(image);
        //f.ShowDialog();

        Complex[,] cImagePadded = ImageDataConverter.ToComplex(image);

        Complex[,] fftImage = FourierTransform.ForwardFFT(cImagePadded);

        foreach (KassWitkinKernel k in Kernels)
        {
            Complex[,] cKernelPadded = k.ToComplexPadded();
            Complex[,] convolved = Convolution.ConvolveInFrequencyDomain(fftImage, cKernelPadded);

            Bitmap temp = ImageDataConverter.ToBitmap(convolved);



            list.Add(temp);
        }

        return list;
    }

person user366312    schedule 20.10.2016    source источник
comment
По каким-то особым причинам вы решили не использовать мои модифицированные версии uStar и vStar?   -  person SleuthEye    schedule 21.10.2016
comment
Если ни один из них не дает надлежащих результатов, вы имеете в виду, что они не дают сами по себе результаты, опубликованные в упомянутой статье, тогда я согласен. Вот почему я добавил комментарий, если намерение состоит в том, чтобы воспроизвести результаты статьи, у вас все еще есть другие препятствия, которые нужно преодолеть. Первый заключается в том, чтобы фактически использовать изображение с резкостью в качестве входных данных для банка фильтров ближе к концу моего поста.   -  person SleuthEye    schedule 21.10.2016
comment
Из того, что я помню, сначала пропускали изображение через фильтр повышения резкости (как описано в утверждении. Во-первых, изображение отображается в оттенках серого и фильтруется с помощью фильтра повышения резкости (мы вычитаем из изображения его отфильтрованную версию с локальным средним значением), тем самым устраняя компонент постоянного тока. из статьи) значительно улучшил результаты.   -  person SleuthEye    schedule 21.10.2016
comment
@SleuthEye, можешь взглянуть на этот вопрос? Я отредактировал его в соответствии с вашим советом.   -  person user366312    schedule 24.10.2016
comment
Пара важных вещей, пока у меня не будет времени опубликовать полный ответ: 1) Bitmap не очень хорошо, чтобы сохранить резкость ввода, которая включает отрицательные значения, вместо этого используйте double[,]. 2) когда вы настраиваете фильтры в KassWitkinFilterBank.Apply, вы должны увеличивать углы с помощью degrees += FilterAngle.   -  person SleuthEye    schedule 26.10.2016


Ответы (1)


Возможно, первое, что следует упомянуть, это то, что фильтры должны генерироваться с углами, которые должны увеличиваться с шагом FilterAngle (в вашем случае 15 градусов). Этого можно добиться, изменив KassWitkinFilterBank.Apply следующим образом (см. эту фиксацию):

public List<Bitmap> Apply(Bitmap bitmap)
{
    // ...

    // The generated template filter from the equations gives a line at 45 degrees. 
    // To get the filter to highlight lines starting with an angle of 90 degrees
    // we should start with an additional 45 degrees offset.
    double degrees = 45;

    KassWitkinKernel kernel;
    for (int i = 0; i < NoOfFilters; i++)
    {
        // ... setup filter (unchanged)

        // Now increment the angle by FilterAngle
        // (not "+= degrees" which doubles the value at each step)
        degrees += FilterAngle;
    }

Это должно дать вам следующий результат:

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

Это не совсем результат бумаги, и различия между изображениями все еще довольно тонкие, но вы должны заметить, что линия царапины наиболее интенсивна на 8-м рисунке (как и следовало ожидать, поскольку угол царапины составляет примерно 100°). -105 градусов).

Чтобы улучшить результат, мы должны кормить фильтры предварительно обработанным изображением так же, как описано в статье:

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

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

Интеграция ваших изменений для добавления повышения резкости изображения из репозитория GitHub с сохранением промежуточных результатов в виде двойников может быть достигнута путем изменения введите bitmap и временные переменные image, чтобы использовать тип данных double[,] вместо Bitmap в методе KassWitkinFilterBank.Apply (см. эту фиксацию):

public List<Bitmap> Apply(double[,] bitmap)
{
    // [...]

    double[,] image = (double[,])bitmap.Clone();

    // [...]
}

который должен дать вам следующий результат:

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

Или, чтобы лучше подчеркнуть разницу, вот цифра 1 (0 градусов) слева, рядом с цифрой 8 (105 градусов) справа:

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

person SleuthEye    schedule 29.10.2016